2

.net 4.5 で次のストアド プロシージャを実行しようとしています。

 PROCEDURE my_procedure ( 
      a_cursor          OUT t_cursor,
      return_value      OUT VARCHAR2,
      a_type                VARCHAR2,
      a_time                DATE,
      a_id                  VARCHAR2,
      a_arg1                VARCHAR2,
      a_from                VARCHAR2,
      a_gl2                 VARCHAR2,
      a_arg2                DATE DEFAULT NULL,
      a_templ               VARCHAR2 DEFAULT NULL 
      )

これらの引数のほとんどは null にすることができます。ヒキガエルでは、次のように実行できます。

BEGIN package.my_procedure( :c, :out, 'arg', '', '123' , '', '', '', '', ''); END;

C# では、次のことを試しています。

object[] parameters = {
         new OracleParameter("arg1", arg1),
         new OracleParameter("arg", "arg"),
         new OracleParameter("empti", ""),
         new OracleParameter("out", OracleDbType.Varchar2, ParameterDirection.Output),
         new OracleParameter("c", OracleDbType.RefCursor, ParameterDirection.Output)
                                      };

     const string sql = "BEGIN package.my_procedure  
          (:c, :out, :arg, :empti, :arg1 , :empti, :empti, :empti, :empti, :empti); END;";
     res = _projectRepository.ExecuteStoredProcedure(sql, parameters);

そして、次のエラーが表示されます

Test method Tests.repository.RepositoryTests.TestMethod1 threw exception: 
Oracle.DataAccess.Client.OracleException: ORA-06550: 
line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'my_procedure'ORA-06550: 
line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'my_procedure'ORA-06550: 
line 1, column 7:
PL/SQL: Statement ignored

オプションのパラメーターの有無にかかわらず、return_value/:out パラメーターの有無にかかわらず試してみました。

Oracle.DataAccess プロバイダー v. 4.112.3.0 を使用しています。それほど多くのパラメーターを持たない/出力パラメーター (カーソル) が 1 つだけの他のストアド プロシージャで動作します。

編集: エラーが 1 つ見つかりました。パラメーター配列の最初に出力パラメーターが必要です。

new OracleParameter("c", OracleDbType.RefCursor, ParameterDirection.Output),
                    new OracleParameter("out", OracleDbType.Varchar2, ParameterDirection.Output),
                    new OracleParameter("arg1", "arg1"),
                    new OracleParameter("empti", ""),
                    new OracleParameter("arg", arg),
                                      };

今、私はエラーが発生しています:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

データベースエラーのようですが、エラーが発生することなくヒキガエルから同じコマンドを実行できるため、奇妙に見えます。

4

2 に答える 2

3

VARCHAR2として使用するOUPUT場合は、文字バッファーのサイズを指定する必要があります。ただし、コンストラクターのオーバーロードはここでは役に立ちません。必要なプロパティを設定するには、手動で変数を作成する必要があります。

// Specify a size adequate for the full return value.
OracleParameter returnValue =
  new OracleParameter("return_value", OracleDbType.Varchar2, 100);
returnValue.ParameterDirection = ParameterDirection.Output;

object[] parameters = {
  returnValue,
  // other parameters here
};

オリジナル

質問の最初のバージョンを処理したので、元の回答をそのまま残します。

提供されたエラーは正しいです。呼び出しで正しい数のパラメーターを提供していません。Toad for Oracle が使用できる元の作業コードを見て、それらをパラメータ名にマッピングしてみましょう。

BEGIN
  package.my_procedure(a_cursor     => :c,
                       return_value => :out,
                       a_type       => 'arg',
                       a_time       => '',
                       a_id         => '123',
                       a_arg1       => '',
                       a_from       => '',
                       a_gl2        => '',
                       a_arg2       => '',  -- DEFAULT NULL
                       a_temp1      => ''); -- DEFAULT NULL
END;

Toad for Oracle では、宣言されたパラメーターに値を提供していることに注意してくださいDEFAULT NULL(これは問題ではありません)。

arg1パラメータ リストを見ると、arg、 、emptiout、およびのバインディングを提供していることがわかりますp。これらを次のように配置して一致させます。

a_cursor     => :c     -- you created the OracleParameter as 'p', not 'c'
return_value => :out  
a_type       => :arg
a_time       => :empti
a_id         => :arg1
a_arg1       => :empti
a_from       => :empti
a_gl2        => :empti
a_arg2       => :empti
a_temp1      => :empti

Oracle は、パラメータの数が一致しなかったと不平を言っています。これは、参照カーソル パラメータを aspではなく asとして宣言しているためですc。最初のパラメータOracleParamterの名前を更新するか、c実行中のPL/SQLを変更する必要があります。:p

于 2012-07-17T14:19:15.163 に答える
1

パラメータとしてアウトカーソルを指定する必要はありません

それ以外の場合は、次のコードを試してください

object[] parameters = {
                                          new OracleParameter("arg1", arg1),
                                          new OracleParameter("arg", "arg"),
                                           new OracleParameter("empti", ""),
                                          new OracleParameter("return_value", OracleDbType.Varchar2, ParameterDirection.Output),
                                          new OracleParameter("a_cursor", OracleDbType.RefCursor, ParameterDirection.Output)
                                      };

                const string sql = "BEGIN package.my_procedure(:a_cursor, :return_value, :arg, :empti, :arg1 , :empti, :empti, :empti, :empti, :empti); END;";
                res = _projectRepository.ExecuteStoredProcedure(sql, parameters);
于 2012-07-17T13:28:10.913 に答える