2013-07-18 48 views
0

既然我有這個Oracle存儲過程(這是一個測試例子)存儲過程/ SYS_REFCURSOR - 錯誤的參數數目

PROCEDURE dave IS 
dave_data SYS_REFCURSOR; 
v_col1 NUMBER; 
v_col2 VARCHAr2(100); 
BEGIN 
DBMS_OUTPUT.ENABLE(2000000); 
dave_truck_ticket.get_report_data(dave_data,1234,'01-JUL-13','15-Jul-13'); 
LOOP 
    FETCH dave_data INTO v_col1, v_col2; 
    EXIT WHEN dave_data%NOTFOUND; 
    DBMS_OUTPUT.PUT_LINE(v_col1||' - '||v_col2); 
END LOOP; 
CLOSE dave_data; 
END; 

而且是錯誤只可能是在存儲過程中 - 因爲我從來不觸摸甲骨文之前..

我試圖讀取從以這種方式將光標(dave_data)數據:

O.OracleConnection objConn = new O.OracleConnection("DATA SOURCE=XXXDEV.WORLD;USER ID=XXXXXX;PASSWORD=XXXXXX;"); 

    O.OracleCommand objCmd = new O.OracleCommand(); 

    objCmd.Connection = objConn; 

    objCmd.CommandText = "DAVE"; 

    objCmd.CommandType = System.Data.CommandType.StoredProcedure; 

    O.OracleParameter cursor = new O.OracleParameter("dave_data", O.OracleDbType.RefCursor); 
    cursor.Direction = System.Data.ParameterDirection.Output; 

    objCmd.Parameters.Add(cursor); 

    try 
    { 

    objConn.Open(); 

    O.OracleDataReader objReader = objCmd.ExecuteReader(); 
    objReader.Read(); 
    objReader[0].ToString(); 

我O.參考被指定爲:使用了O = Oracle.DataAccess.Client; (4.112.3.0版)

我收到(後直接的ExecuteReader())是錯誤: Oracle error

什麼是更令人氣憤的是,我可以從服務器資源管理器執行的例子 - 和它的作品只是精細!

請善待並指出在那裏我是一個打頭....

+3

你的過程搞砸了。您需要將參考光標作爲proc的參數,並將其打開。無需做任何循環/取指。這就是你的客戶代碼將會做的事情。這裏是一個鏈接(沒有C#壽) - http://www.oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets.php – OldProgrammer

+0

你爲什麼不直接調用'get_report_data' ?包裝程序的要點是什麼? –

回答

0

問題是與Oracle過程,而不是C#代碼。我從另一位開發人員那裏收到了Oracle的程序,並且我們交叉了電線。一旦他用參考光標創建了一個OUT參數,它工作得很好。 +1給OldProgrammer - 你應該讓你的評論成爲答案!