6

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

ストアド プロシージャ

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ますか?

4

5 に答える 5

7

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

于 2012-07-16T13:30:29.013 に答える
6

入力パラメーターに関する最も一般的な問題は、null. kfcKeyoruser_idnull(null 参照、または値のない a のいずれか) である場合Nullable<T>、多くのプロバイダー (したがって、Oracle も想定している) では、 parameter は追加されません。を渡すには、通常、代わり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);
于 2012-07-16T13:27:49.590 に答える
3

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

于 2013-02-27T19:34:06.657 に答える
0

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

于 2014-12-04T05:40:23.203 に答える
0

私は同様の問題を経験し、根本的な原因がばかげていることを発見しました。問題が似ている場合は、これが役立つ場合があります。

この場合、パッケージのプロシージャ コールから正確なエラー メッセージが返されます。Java コード、そのパラメーター、およびバックエンド パッケージ「本体」とそのプロシージャーを何十回も検証した後、違いを見つけることができませんでした。

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

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

于 2015-02-10T08:19:29.453 に答える