ODP.NETを使用してRefCursorを返すユーザー定義のOracle関数を実行しようとしています。関数は次のとおりです。
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を取り戻すことができます。しかし、DataSetを埋めるために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の使用に関する多くの情報とサンプルを見つけることができましたが、関数からRefCursorを返すための情報はそれほど多くありませんでした。
編集: 入力パラメータをOracleCommandオブジェクト(つまり)に明示的に追加したくないのは、sqlCom.Parameters.Add("id", OracleDbType.Int32,ParameterDirection.Input).Value = 7;
これを汎用のRESTful Webサービスとして実装するのが難しいためですが、最後の手段として予約していますが、代わりにストアドプロシージャを使用します。
どんな助けでも大歓迎です!