0

C# からストアド プロシージャを呼び出すと、次の例外が発生します。

ORA-06550: 行 1、列 7:
PLS-00306: 'MY_PROC' の呼び出しで引数の数または型が正しくありません
ORA-06550: 行 1、列 7: PLS-00306:
' MY_PROC'
ORA-06550: 行 1、列 7:
PL/SQL: ステートメントは無視されました

私の手順には 57 個の引数があるため、実際にどこに問題があるのか​​を知るのは簡単ではありません。より詳細なメッセージを表示する方法はありますか?

注: ただし、引数の型と数は一致しているようです。

ストアド プロシージャの引数は次のとおりです。

Var_PE_...  IN  NUMBER(8,0),
Var_PE_...  IN  NUMBER(4,0),
Var_PE_...  IN  NUMBER(3,0),
Var_PE_...  IN  DATE,
Var_PE_...  IN  DATE,
Var_PE_...  IN  NUMBER(2,0),
Var_PE_...  IN  NUMBER(4,0),
Var_PE_...  IN  NUMBER(4,0),
Var_PE_...  IN  NUMBER(8,0),
Var_PE_...  IN  NUMBER(7,0),
Var_PE_...  IN  VARCHAR2(1 BYTE),
Var_PE_...  IN  CHAR(1 BYTE),
Var_PE_...  IN  NUMBER(15,0),
Var_PE_...  IN  VARCHAR2(25 BYTE),
Var_PE_...  IN  VARCHAR2(25 BYTE)
Var_PE_...  IN  VARCHAR2(25 BYTE),
Var_PE_...  IN  VARCHAR2(25 BYTE),
Var_PE_...  IN  NUMBER(5,0),
Var_PE_...  IN  VARCHAR2(25 BYTE),
Var_PE_...  IN  VARCHAR2(25 BYTE),
Var_PE_...  IN  NUMBER(5,0),
Var_PE_...  IN  NUMBER(5,0),
Var_PE_...  IN  VARCHAR2(11 BYTE),
Var_PE_...  IN  NUMBER(2,0),
Var_PE_...  IN  CHAR(2 BYTE),
Var_PE_...  IN  VARCHAR2(17 BYTE),
Var_PE_...  IN  DATE,
Var_PE_...  IN  DATE,
Var_PE_...  IN  DATE,
Var_PE_...  IN  NUMBER(12,5),
Var_PE_...  IN  NUMBER(9,2),
Var_PE_...  IN  NUMBER(3,0),
Var_PE_...  IN  NUMBER(9,2),
Var_PE_...  IN  CHAR(2 BYTE),
Var_PE_...  IN  CHAR(3 BYTE),
Var_PE_...  IN  NUMBER(3,0),
Var_PE_...  IN  NUMBER(7,2),
Var_PE_...  IN  NUMBER(3,0),
Var_PE_...  IN  NUMBER(9,2), 
Var_PE_...  IN  NUMBER(9,2),
Var_PE_...  IN  NUMBER(10,0),
Var_PE_...  IN  VARCHAR2(49 BYTE),
Var_PE_...  IN  CHAR(1 BYTE),
Var_PE_...  IN  CHAR(1 BYTE),
Var_PE_...  IN  CHAR(6 BYTE),
Var_PE_...  IN  CHAR(1 BYTE),
Var_PE_...  IN  NUMBER(9,2),
Var_PE_...  IN  VARCHAR2(13 BYTE),
Var_PE_...  IN  NUMBER(2,0),
Var_PE_...  IN  VARCHAR2(2 BYTE),
Var_PE_...  IN  DATE,
Var_PE_...  IN  DATE,
Var_PE_...  IN  VARCHAR2(1 BYTE),
Var_PE_...  IN  NUMBER(2,0),
Var_PE_...  IN  VARCHAR2(20 BYTE),

Var_PS...   OUT VARCHAR2,
Var_PS...   OUT VARCHAR2

そして、これがC#からのこのプロシージャへの私の呼び出しです:

l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date,       0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date,       0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date,       0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date,       0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date,       0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date,       0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date,       0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));

l_Params.Add(CreateOutputDbParameter(DbType.AnsiString, 2000, "PS_..."));
l_Params.Add(CreateOutputDbParameter(DbType.AnsiString, 2000, "PS_..."));

ExecuteStoreProcedure("MY_PROC", l_Params);

パラメータを作成するためのホーム コード:

    public DbParameter CreateInputDbParameter(DbType typeParam, int sizeparam,
        string nameParam, object valueParam)
    {
        DbParameter DbParam = Parameter;
        DbParam.DbType = typeParam;
        DbParam.Size = sizeparam;
        DbParam.Direction = ParameterDirection.Input;
        DbParam.ParameterName = nameParam;
        if (valueParam == null)
        {
            DbParam.Value = DBNull.Value;
        }
        else
        {
            DbParam.Value = valueParam;
        }
        return DbParam;
    }

    public DbParameter CreateOutputDbParameter(DbType typeParam, int sizeparam, string nameParam)
    {
        DbParameter DbParam = Parameter;
        DbParam.DbType = typeParam;
        DbParam.Size = sizeparam;
        DbParam.Direction = ParameterDirection.Output;
        DbParam.ParameterName = nameParam;
        return DbParam;
    }
4

1 に答える 1

0

出力の場合は、パラメータ方向を ParameterDirection.Output として設定する必要があります

OracleParameter test= 
    new OracleParameter("testparameter", OracleDbType.Varchar2);
test.Direction = ParameterDirection.Output;
cmd.Parameters.Add(test);

入力の場合は、ParameterDirection.Input として設定します

パラメータのサイズを確認してください。宣言時にサイズを指定していません。また、パラメータのタイプも重要です。たとえば、 でマッピングNUMBER(15,0)DbType.Int32、 でNUMBER(3,0)マッピングしましたDbType.Double

編集

ADO.NET基本クラスを使用してOracleに接続しようとしていますが、System.Data.OracleClient非推奨であることもわかっています。

System.Data.OracleClient の型は非推奨です。これらの型は .NET Framework のバージョン 4 でサポートされていますが、将来のリリースでは削除される予定です。Microsoft は、サード パーティの Oracle プロバイダーを使用することをお勧めします。

Oracle Data Provider for .NETを使用すると、これらのエラーのほとんどが解決されます。

于 2012-06-22T09:09:28.537 に答える