我正在使用提供基于Oracle函数的数据库API的产品,并且通过ODP.NET可以调用函数。但是,我无法弄清楚,如何调用一个包含Ref Cursor作为Out参数的函数。到目前为止,我发现的所有样本或者使用Out参数调用过程,或者使用Ref Cursor作为返回值调用函数。我试图类似地定义参数,但不断收到提供错误数量或类型参数的错误。如何使用Ref Cursor作为C#外部参数调用Oracle函数?
下面是函数头(显然混淆):
FUNCTION GetXYZ(
uniqueId IN somepackage.Number_Type,
resultItems OUT somepackage.Ref_Type)
RETURN somepackage.Error_Type;
这些都是在 “somepackage” 的类型定义:
SUBTYPE Number_Type IS NUMBER(13);
TYPE Ref_Type IS REF CURSOR;
SUBTYPE Error_Type IS NUMBER;
这是我试过的代码:
string sql = "otherpackage.GetXYZ";
var getXYZCmd = OracleCommand oracleConnection.CreateCommand(sql);
getXYZCmd.CommandType = CommandType.StoredProcedure;
getXYZCmd.Parameters.Add("uniqueId", OracleDbType.Int32).Value = uniqueExplosionId;
getXYZCmd.Parameters.Add("resultItems", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
getXYZCmd.Parameters.Add("return_value", OracleDbType.Int32).Direction = ParameterDirection.ReturnValue;
我试过以下不同的方式来调用函数(当然每次只有一个):
var result = getXYZCmd.ExecuteNonQuery();
var reader = getXYZCmd.ExecuteReader();
var scalarResult = getXYZCmd.ExecuteScalar();
但他们每个人的失败,出现错误消息:
Oracle.DataAccess.Client.OracleException: ORA-06550: line 1, column 15:
PLS-00306: wrong number or types of arguments in call to 'GETXYZ'
ORA-06550: line 1, column 15:
PLS-00306: wrong number or types of arguments in call to 'GETXYZ'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored.
那么,这通常可以从C#调用函数与参考光标作为输出参数与ODP.NET?我可以调用与Varchar2-Out参数相同的结构而不是参考游标没有问题的函数...
顺便说一句,我使用ODP.NET版本2.112.2.0从Visual C#.NET 3.5中Studio 2008.
在此先感谢您的帮助!
感谢您提供samples目录。你已经保存了一天:] – 2016-08-19 08:13:01