MEMO-取回Oracle Procedure Ref Cursor

[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);
歡迎推文分享:
Published 23 July 2009 01:27 PM 由 Jeffrey
Filed under: , ,
Views: 10,838



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<July 2009>
SunMonTueWedThuFriSat
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication