22

ojdbc14.jar を使用して Java 1.6 から Oracle FUNCTION (ストアド プロシージャではない) を呼び出す際に問題が発生しています。

リモートサーバーから呼び出しているため、関数に何が含まれているかわかりません。わかっているのはこれだけです。

FUNCTION ap_ch_get_acct_balances (VAR_PI_MOB_NO_ACCT_NO VARCHAR2,
VAR_REPLY_CODE OUT NUMBER, VAR_EXT_RESPONSE OUT VARCHAR2, VAR_PO_ACC_BAL OUT CHAR,
VAR_PO_ACCT_NO OUT CHAR)   

使用する必要があるスキーマは次のとおりです: FCRLIVE.AP_CH_GET_ACCT_BALANCES

私はこれを試しています:

String call = "{ ? = call FCRLIVE.AP_CH_GET_ACCT_BALANCES(?, ?, ?, ?, ?) }";
CallableStatement cstmt = conn.prepareCall(call);
cstmt.setQueryTimeout(1800);
cstmt.setString(1, inputCode);
cstmt.registerOutParameter(2, oracle.jdbc.OracleTypes.NUMBER);
cstmt.registerOutParameter(3, oracle.jdbc.OracleTypes.VARCHAR);
cstmt.registerOutParameter(4, oracle.jdbc.OracleTypes.CHAR);
cstmt.registerOutParameter(5, oracle.jdbc.OracleTypes.CHAR);
cstmt.executeUpdate();

しかし、ログファイルにこれが表示され続けます:

java.sql.SQLException: ORA-01006: bind variable does not exist
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
    at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
    at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573)
    at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1891)
    at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093)
    at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047)
    at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2688)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589)

関数の呼び出し方が間違っていますか? または、これはおそらく何でしょうか?

助けてくれてありがとう!

4

4 に答える 4

20

そのはず:

String call = "{ ? = call FCRLIVE.AP_CH_GET_ACCT_BALANCES(?, ?, ?, ?, ?) }";
于 2012-10-31T12:45:22.333 に答える
0

戻りパラメータは 1 つだけです。最初の1つ。その型を登録しなければならないのはこれだけです。だから、まず最初に:

cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.VARCHAR);

次に、必要に応じて他のパラメータを設定/登録しますが、疑問符のように 6 つのパラメータがあり、5 つだけを処理します。6 番目のパラメータも設定する必要があります。

cstmt.setString(6, myVariable);

不明な場合は、使用している SQL 関数のプロトタイプを投稿してください。不足しているバインディングを正確に指摘します。

于 2013-07-04T05:18:05.733 に答える