2009-07-31 57 views
0

我正在使用ODP.NET(從Microsoft提供程序遷移),並且我遇到了返回refcursor的存儲過程。我有以下的PL/SQL程序(我已經改變了那麼一點點,使其更通用):Oracle RefCursor參數問題

PROCEDURE MyProc(parameter_no1 IN NUMBER, parameter_no2 IN NUMBER, RETCURSOR OUT ret_type) AS 
BEGIN 
    OPEN RETCURSOR FOR 
    SELECT ad.logo logo 
    FROM tab_a a, tab_h h 
    WHERE a.id IS NOT NULL 
    AND a.h_id = h.id 
    AND a.no1 = parameter_no1 
    AND a.no2= parameter_no2; 
END HanteraLogotype; 

然後,我有folloing C#代碼來調用它:

internal void RefCursorDataReader() 
{ 
    OracleCommand cmd = new OracleCommand("ABC$MYPACKAGE.MyProc", new OracleConnection(_constr)); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Connection.Open(); 
    cmd.BindByName = true; 

    OracleParameter p = cmd.Parameters.Add("parameter_no1", OracleDbType.Decimal); 
    p.Value = 12345678; 
    p.Direction = ParameterDirection.Input; 

    p = cmd.Parameters.Add("parameter_no2", OracleDbType.Decimal); 
    p.Value = 123456; 
    p.Direction = ParameterDirection.Input; 

    p = cmd.Parameters.Add("RETCURSOR", OracleDbType.RefCursor); 
    p.Direction = ParameterDirection.Output; 

    OracleDataReader reader = cmd.ExecuteReader(); 

    if (reader.Read()) 
    { 
    System.Diagnostics.Debug.WriteLine(reader[0].GetType().ToString()); 
    } 

    cmd.Connection.Close(); 
} 

而且當我運行它,我不斷收到此異常:

ORA-03106:致命雙任務通信協議錯誤

我已經嘗試過許多不同的參數,他們的類型,順序等變化,但似乎沒有任何幫助。這是拋出異常的reader.Read()。我真的很感謝幫助這個!

加了: 的ret_type定義爲:

TYPE ret_type IS REF CURSOR;

+0

類型的標誌是LONG RAW ,這似乎是問題所在。如果我將其更改爲數字,它會起作用。 – kaze 2009-07-31 07:14:19

回答

1

這看起來像一個錯誤。 3106錯誤是一個不應該發生的錯誤。我相信有一個解決方法!

問題ODP.NET問題的最佳地點在OTN ODP.NET論壇上已經結束。如果我是你,我會發布此那邊:

http://forums.oracle.com/forums/forum.jspa?forumID=146&start=0

而且搜索「3106」

0

特定的論壇上,我升級到11G ODP.NET