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