Oracle RefCursor的参数问题

时间:2009-07-31 06:28:00

标签: c# oracle odp.net ref-cursor

我正在使用ODP.NET(从Microsoft的提供程序迁移),并且我遇到了一个返回refcursor的存储过程。我有以下PL / SQL过程(我已经改变了一点以使其更通用):

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;

然后我有下面的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;

2 个答案:

答案 0 :(得分:1)

这看起来像个错误。 3106错误是一个永远不会发生的错误。我确定有一个解决方法!!

在OTN ODP.NET论坛上,提出ODP.NET问题的最佳地点已经结束。如果我是你,我会发布在那里:

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

还搜索特定论坛的“3106”

答案 1 :(得分:0)

我升级到11G ODP.NET