0

1 つの INOUT パラメーターと 4 つの IN パラメーターを受け入れる JTOPEN (JDBC) 接続を使用して、SQL 経由で AS400 ストアド プロシージャを呼び出す必要があります。私は次のSQLでこれをやっています

CALL MYLIB.MYSP( ? ,'AJAJA1', '11111111', 'ą, ę, ć, ł, ń, ś, ż, ź', '0')

しかし、それはエラーをスローします

[SQL0313] ホスト変数の数が無効です。

疑問符の代わりに '' を使用すると、

[SQL0469] MYLIBのプロシージャMYSPのパラメータ1にIN、OUTまたはINOUTは無効です。

これは可能ですか?

4

1 に答える 1

1

ストアド プロシージャの最初のパラメーターは INOUT パラメーターであるため、CallableStatement オブジェクトを使用し、最初のパラメーターを出力パラメーターとして登録し、最初のパラメーターの値を設定する必要があります。

JTOpen には、リフレクションを使用して Java メソッドを呼び出す JDBC クライアントがあります。最初のパラメーターが inout パラメーターであるストアド プロシージャを呼び出す例を次に示します。(注: プログラムは、呼び出すメソッドを推測しようとするため、多くのノイズを生成します。1 つのメソッドが失敗すると、別のメソッドが試行されます。また、registerOutParameter 呼び出しの 12 は、実際には java.sql.Type.VARCHAR です)。

~> java -cp jt400.jar com.ibm.as400.access.jdbcClient.Main jdbc:as400:SYSTENAME USERID PASSWORD  
>CREATE PROCEDURE MYCONCAT(INOUT P1 VARCHAR(512) , P2 VARCHAR(80), P3 VARCHAR(80), P4     VARCHAR(80))  LANGUAGE SQL BEGIN SET P1 = P1 || P2 || P3 || P4; END 

>!SETVAR CSTMT=CON.prepareCall("CALL MYCONCAT(?,'B','C','D')")
CSTMT=STMT0002
...
>!CALLMETHOD CSTMT.registerOutParameter(1,12)
...
>!CALLMETHOD CSTMT.setString(1,'A')
...
>!CALLMETHOD CSTMT.execute()
...
Call returned false
>!CALLMETHOD CSTMT.getString(1)
Call returned ABCD
于 2014-07-25T21:36:15.843 に答える