web-dev-qa-db-ja.com

ORA-06550:行1、列7:PLS-00306:引数の数またはタイプが間違っています

Oracle11gサーバーでのストアドプロシージャの呼び出しに問題があります。

ストアドプロシージャ

_PROCEDURE get_rit_by_user_id(KDC_KEY      IN VARCHAR2,
                             p_id_utente IN NUMBER,
                             p_cur_out   OUT type_cursor) IS
  BEGIN
    ...
    ...
    ...
  END
_

c#コード

_OracleCommand cmd = new OracleCommand();
cmd.Connection = oracleConnection;
cmd.CommandText = userIdEsercizio + packageName + "GET_RIT_BY_USER_ID";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("KDC_KEY", OracleDbType.Varchar2, kdcKey, ParameterDirection.Input);
cmd.Parameters.Add("P_ID_UTENTE", OracleDbType.Int32, user_id, ParameterDirection.Input);
cmd.Parameters.Add("P_CUR_OUT", OracleDbType.RefCursor, ParameterDirection.Output);

OracleDataReader reader = cmd.ExecuteReader();
_

cmd.ExecuteReader()はこの例外をスローします:

ORA-06550:行1、列7:PLS-00306: 'GET_RIT_BY_USER_ID'の呼び出しで引数の数またはタイプが正しくありませんORA-06550:行1、列7:PL/SQL:文が無視されました

_wrong number of types of arguments_エラーが発生する上記のコードの何が問題になっていますか?

6
Rocco Jr.

2番目のパラメーターはNUMBERであり、整数ではありません。 2番目のパラメータタイプをOracleDbType.Decimalに変更します

http://docs.Oracle.com/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm

Addメソッドの構文も確認してください。コードが少し冗長になったとしても、今のところ、パラメータのプロパティをより明示的に指定する方がよい場合があります。

cmd.Parameters.Add(
    new OracleParameter() 
        {
            ParameterName="KDC_KEY", 
            DbType=OracleDbType.Varchar2, 
            Value=kdcKey, 
            Direction=ParameterDirection.Input
        } 
    );

等.

Procは結果セットを返しますかカーソルに加えて?そうでない場合は、ExecuteNonQueryの代わりにExecuteを使用してください

6
D Stanley

入力パラメータに関する最も一般的な問題はnullです。 kfcKeyまたはuser_idnull(null参照、または値のないNullable<T>)の場合、多くのプロバイダー(したがって、Oracleも想定) )it パラメータを追加しませんnullを渡すには、通常、代わりにDBNull.Valueを渡す必要があります。

したがって、nullsを確認してください。

cmd.Parameters.Add("KDC_KEY", OracleDbType.Varchar2,
    (object)kdcKey ?? DBNull.Value, ParameterDirection.Input);
cmd.Parameters.Add("P_ID_UTENTE", OracleDbType.Int32,
    (object)user_id ?? DBNull.Value, ParameterDirection.Input);
5
Marc Gravell

パラメータのスペルを確認してください。特に、出力変数がある場合は、ストアドプロシージャの変数名と一致する必要があります。同様の問題のトラブルシューティングに数時間を費やしたところ、出力パラメーター名のスペルが間違っていたことが判明しました。

3
Manny

「type_cursor」と呼ばれるある種のユーザー定義型がありますが、SYS_REFCURSORパラメーターをバインドしています。これがこのエラーの原因です。

0
Christian Shay

私は同様の問題を経験し、根本的な原因がばかげていることに気づきました。あなたの問題が似ているなら、これはあなたを助けるかもしれません。

この場合、正確なエラーメッセージがパッケージのプロシージャコールから返されています。 Javaコード、そのパラメーター、バックエンドパッケージ "Body"、およびそのプロシージャを数十回検証した後、違いを理解できませんでした。

次に、そのパッケージには、パラメーターの数が異なる同様の手順があることに気付きました。そして、ここでの「キャッチ」は、パッケージがフロントエンドから呼び出されている新しいメソッドでコンパイルされていないことです。それで、それは古い手順に行きます。

これがあなたのケースと同じであるかどうかを確認してください。

0
Sarath