我正在尝试执行一个用户定义的 Oracle 函数,该函数使用 ODP.NET 返回一个 RefCursor。这是功能:
CREATE OR REPLACE FUNCTION PKG.FUNC_TEST (ID IN TABLE.ID%type)
RETURN SYS_REFCURSOR
AS
REF_TEST SYS_REFCURSOR;
BEGIN
OPEN REF_TEST FOR
SELECT *
FROM TABLE;
RETURN REF_TEST;
END;
/
我可以在 Toad 中调用这个函数(从 dual 中选择 func_test(7))并取回一个 CURSOR。但我需要使用 C# 和 ODP.NET 获取光标来填充数据集,但我不断收到 NullReferenceException -“对象引用未设置为对象的实例”。这就是我所拥有的:
OracleConnection oracleCon = new OracleConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
OracleCommand sqlCom = new OracleCommand("select func_test(7) from dual", oracleCon);
sqlCom.Parameters.Add("REF_TEST", OracleDbType.RefCursor, ParameterDirection.ReturnValue);
OracleDataAdapter dataAdapter = new OracleDataAdapter();
dataAdapter.SelectCommand = sqlCom;
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet); //FAILS HERE with NullReferenceException
我能够找到很多关于使用存储过程和 ODP.NET 的信息和示例,但对于从函数返回 RefCursors 来说却不是很多。
编辑: 我不想将输入参数显式添加到 OracleCommand 对象(即sqlCom.Parameters.Add("id", OracleDbType.Int32,ParameterDirection.Input).Value = 7;
),因为这使得很难将其实现为通用 RESTful Web 服务,但我将其保留为最后的手段,但会使用存储过程。
任何帮助深表感谢!