3

次のストアド プロシージャを定義しています。

CREATE OR REPLACE PROCEDURE NOTIFY_INSERT (
  FLAG IN VARCHAR2,
  MESSAGE IN OUT CLOB,
  SEQ_NO OUT NUMBER
) 
AS
BEGIN
...
END;

今、このストアド プロシージャを JDBC で呼び出そうとしています。ただし、「java.sql.SQLException: Parameter Type Conflict」という例外が発生します。これはラインから上げられます

call.execute();

CLOB である 2 番目のパラメーターと関係があると思います。

誰かが私が間違っていることを知っていますか?

ご協力いただきありがとうございます。

Connection connection = dataSource.getConnection();
CallableStatement call = null;
try {
    call = connection.prepareCall("{ call NOTIFY_INSERT (?,?,?) }");
    call.setString(1, flag);
    call.registerOutParameter(2, Types.CLOB);
    call.setString(2, message);
    call.registerOutParameter(3, Types.NUMERIC);
    call.execute();
    sequenceNo = call.getLong(3);
    message = call.getString(2);
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    if (call != null) {
        try { call.close(); } catch (SQLException sqle) {}
    }
}

JDBC 例外:

java.sql.SQLException: Parameter Type Conflict
    at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:2480)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4356)
    at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:4595)
    at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:10100)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:5693)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)
4

1 に答える 1

5

String を CLOB 型のパラメーターに直接渡すことはできないと思います。CLOB パラメータをバインドしようとすると、次のことができます。

すでにお持ちの場合Clob:

call.setClob(1, clob);

Stringaを aに変換する場合Clob:

call.setCharacterStream(1, new StringReader(string), string.length());

null CLOB を設定する場合:

call.setNull(1, Types.CLOB);

このソリューションも参照できます。

于 2013-01-08T19:11:00.927 に答える