【问题标题】:How do I use an IN OUT CLOB parameter defined in a Stored Proc in Oracle JDBC?如何使用在 Oracle JDBC 的存储过程中定义的 IN OUT CLOB 参数?
【发布时间】:2013-01-08 17:42:23
【问题描述】:

我定义了以下存储过程:

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

现在我试图在 JDBC 中调用这个存储过程。但是,我得到一个异常说“java.sql.SQLException:参数类型冲突”。这是从线提出来的

call.execute();

我猜它与第二个参数有关,它是一个 CLOB。

有人知道我做错了什么吗?

感谢您的帮助。

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)

【问题讨论】:

    标签: java oracle jdbc


    【解决方案1】:

    我不认为您可以将字符串直接传递给 CLOB 类型的参数。尝试绑定 CLOB 参数时,您可以执行以下操作:

    如果你已经有Clob

    call.setClob(1, clob);
    

    如果要将String 转换为Clob

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

    如果你想设置一个空的CLOB:

    call.setNull(1, Types.CLOB);
    

    你也可以看到this solution

    【讨论】:

    • 我仍然需要测试这个解决方案,但它看起来是正确的方法。如果我能够让它工作,我会告诉你...
    • @LateDownvoter:为什么投反对票?为什么要 1 1/2 个月后?
    • 不确定谁投了反对票,但我投了赞成票。这是正确的答案。
    猜你喜欢
    • 2019-04-26
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2018-12-23
    • 2018-09-19
    • 2013-11-02
    相关资源
    最近更新 更多