0

私は、参照カーソルを返すオラクルのストアド関数から結果セットを取得しようとして髪を引っ張っています。

Oracle Stored Functionによる宣言は次のとおりです。

TYPE GetInspectorCursor IS REF CURSOR;
FUNCTION GetInspectorInformation
   (inUserID IN inspectortable.userid%type,
    inPassword IN inspectortable.password%type,
    inCompanyID IN inspectortable.cid%type,
    inSubCompanyID in inspectortable.scid%type,
    outErrorcode OUT NUMBER)
RETURN GetInspectorCursor;

結果セットを取得するための私のC#プログラムは次のとおりです。

        String connString = "DATA SOURCE=PEOPLE.WORLD;PASSWORD=password;PERSISTSEC CURITY INFO=True;USER ID=userid";


        DataSet ds;
        OracleDataAdapter myAdapter = null;
        Oracle.DataAccess.Types.OracleRefCursor refCursor = null;

        OracleConnection myCon = new OracleConnection(connString);

        String commandText = "schema.package.GetInspectorInformation";

        OracleCommand cmd = new OracleCommand(commandText, myCon);
        cmd.CommandType = CommandType.StoredProcedure;


        // inpectorID
        OracleParameter param = new OracleParameter();
        param.OracleDbType = OracleDbType.Char;
        param.Direction = ParameterDirection.Input;
        param.Value = "JOHN";
        cmd.Parameters.Add(param);

        // inspector Password
        OracleParameter param2 = new OracleParameter();
         param2.OracleDbType = OracleDbType.Char;
         param2.Direction = ParameterDirection.Input;
         param2.Value = "12345";
        cmd.Parameters.Add(param2);

        // VALUE 1
        OracleParameter param3 = new OracleParameter();
         param3.OracleDbType = OracleDbType.Char;
         param3.Direction = ParameterDirection.Input;
         param3.Value = "VA1";
        cmd.Parameters.Add(param3);

        // VALUE 2
        OracleParameter param4 = new OracleParameter();
         param4.OracleDbType = OracleDbType.Char;
         param4.Direction = ParameterDirection.Input;
         param4.Value = "VA2";
        cmd.Parameters.Add(param4);

        // outParam Error Code
        OracleParameter param5 = new OracleParameter();
         param5.OracleDbType = OracleDbType.Decimal;
         param5.Direction = ParameterDirection.Output;
         //param5.IsNullable = true;
        cmd.Parameters.Add(param5);


        OracleParameter param6 = new OracleParameter();
         param.ParameterName = "RefCursor";
         param6.OracleDbType = OracleDbType.Object;
         param6.OracleDbTypeEx = OracleDbType.RefCursor;
         param6.Direction = ParameterDirection.ReturnValue;
         ///param6.IsNullable = false;
         cmd.Parameters.Add(param6);


         myCon.Open();

         cmd.ExecuteNonQuery();


        refCursor = (Oracle.DataAccess.Types.OracleRefCursor)cmd.Parameters["RefCursor"].Value;
        myAdapter = new OracleDataAdapter("", myCon);
        ds = new DataSet("testDS");
        myAdapter.Fill(ds, refCursor);

        // Clean up
        cmd.Dispose();
        myCon.Close();
        myCon.Dispose();

myCon.Open() 呼び出しで、次のようになります。

 ORA-06550: line 1, column 15:
 PLS-00306: wrong number or types of arguments in call to 'GETINSPECTORINFORMATION'
 ORA-06550: line 1, column 7:
 PL/SQL: Statement ignored

誰かが親切にいくつかの脳細胞を惜しまず、どのパラメーターが間違って渡されているかを教えてくれますか?

ありがとう!!!!

4

1 に答える 1

0

関数を介して REF CURSOR を返す方法はわかりませんが、プロシージャを介して REF CURSOR を返すことができます。これを試してください - 以前は多くのプロジェクトでうまくいきました:

まず、関数をプロシージャに変更します。

PROCEDURE GetInspectorInformation
   (inUserID IN inspectortable.userid%type,
    inPassword IN inspectortable.password%type,
    inCompanyID IN inspectortable.cid%type,
    inSubCompanyID in inspectortable.scid%type,
    outErrorcode OUT NUMBER,
    retCursor getInspectorCursor OUT);

次に、C# コードで、これを変更します...

param6.Direction = ParameterDirection.ReturnValue;

…これに…

param6.Direction = ParameterDirection.Output;

myCon.Open()次に、以下で始まるすべてを置き換えて、データセットを埋めます。

ds = new DataSet("testDS");
new OracleDataAdapter(cmd).Fill(ds);

これに問題がある場合は、これを行うたびに、私のコードには投稿したものと次の違いがあることに注意してください。

  • 参照カーソルが唯一 OUTのパラメーターでした
  • ref カーソルはジェネリックです。SYS_REFCURSOR
  • adapter.Fill、データ セット内のデータ テーブルに移動しました (new OracleDataAdapter(cmd).Fill(ds.myTableName)

したがって、まだ少し実験する必要があるかもしれませんが、私が言ったように、これは以前はうまくいきました.

于 2013-03-15T19:17:17.717 に答える