我正在使用一种产品,该产品提供基于 Oracle 函数的数据库 API,并且我通常能够通过 ODP.NET 调用函数。但是,我不知道如何调用包含 Ref Cursor 作为 Out 参数的函数。到目前为止,我发现的所有示例要么调用具有 Out 参数的过程,要么调用具有 Ref Cursor 作为返回值的函数。我尝试类似地定义参数,但不断收到错误,即提供了错误数量或类型的参数。
这是函数头(显然是混淆的):
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.
那么通常是否可以使用 ODP.NET 从 C# 调用具有 Ref Cursor 作为 Out-parameter 的函数?我可以使用 Varchar2-Out 参数而不是 Ref Cursor 调用具有相同结构的函数,而不会出现问题...
顺便说一句,我在 Visual Studio 2008 中使用 C#.NET 3.5 中的 ODP.NET 版本 2.112.2.0。
在此先感谢您的帮助!