[MEMO系列是老人家備忘用途的貼文,可能沒什麼營養,大家請姑且看之或逕行忽略。]

好久沒跟ORACLE纏綿惹,這陣子都在跟SQL Server廝混。這幾天接手另一個連線ORACLE的專案,在呼叫ORACLE Procedure透過Ref Cursor傳回結果時,腦中已不太記得精確寫法,只記得Ref Cursor的值可以直接用來Fill DataTable或轉成OracleDataReader,胡亂湊出程式碼,系統卻一直傳回以下錯誤:

ORA-06550: line 1, column 7:.PLS-00221: 'MyProc' is not a procedure or is undefined.

OracleCommand cmd = new OracleCommand 
{ 
    CommandText = "MyProc", 
    CommandType = CommandType.StoredProcedure 
};
cmd.Parameters.Add("p_arg1", OracleType.VarChar).Value = "blah";
cmd.Parameters.Add("p_arg2", OracleType.VarChar).Value = "blahbooboo";
dt = MyUtil.GetDataTable(cmd, cnnString);

在錯誤訊息的導引下,拼了老命張大眼睛檢查,Procedure名稱確定沒有拼錯,也確認該Procedure存在於資料庫中。雖然有點殺雞用牛刀,但我還是用茶包射手的手法解決這個問題(其實是太久沒射茶包技癢),祭出了Microsoft Network Monitor查看封包,發現我的程式組合出以下的PL/SQL送去執行:

begin
MyProc(p_arg1=>:p_arg1, p_arg2=>:p_arg2);
end;

這段PL/SQL錯在沒有接回Procedure所傳回的Ref Cursor,而在ORACLE上執行的確就會傳回找不到MyProc這個Procedure的錯誤訊息。

找出問題後一切好說,原來就是自己老糊塗沒搞清楚Ref Cursor的接回方法,怪不得人。參考微軟KB,加上OracleType.Cursor參數,問題解決!

OracleCommand cmd = new OracleCommand 
{ 
    CommandText = "MyProc", 
    CommandType = CommandType.StoredProcedure 
};
cmd.Parameters.Add("p_refcur", OracleType.Cursor).Direction 
    = ParameterDirection.ReturnValue;
cmd.Parameters.Add("p_arg1", OracleType.VarChar).Value = "blah";
cmd.Parameters.Add("p_arg2", OracleType.VarChar).Value = "blahbooboo";
dt = MyUtil.GetDataTable(cmd, cnnString);

Comments

Be the first to post a comment

Post a comment