【问题标题】:Passing XML as a CLOB to Oracle gives me "ORA-22922: nonexistent LOB value" error将 XML 作为 CLOB 传递给 Oracle 会出现“ORA-22922:不存在的 LOB 值”错误
【发布时间】:2015-05-23 23:47:34
【问题描述】:

我正在构建一个 Web 服务,它在负载中获取输入 XML 并将其存储在数据库中。

在 DAO 层中,我正在使用 XML 字符串创建一个 clob 对象,例如:

CLOB clob = CLOB.createTemporary(conn,false,CLOB.MODE_READWRITE);
            clob.putString(1,inputXml);

我将这个 clob 对象传递给存储过程:

declareParameter(new SqlParameter("i_xml", OracleTypes.CLOB));

在可执行方法中:

params.put("i_xml",clob);       
Map<?, ?> result = execute(params);

所以,当我调用这个 Web 服务时,我可以看到 XML 正在正确地发送到 Oracle DB,但是我从数据库中收到一条错误消息:

System Error occured while Creating ORA-22922: nonexistent LOB value

请告诉我如何解决此问题。提前致谢。

【问题讨论】:

  • 这个answer 可能对你有帮助。
  • 您还应该注意 LOB 读取一致性,并确保避免在过程中提交或回滚。
  • CLOB.createTemporary()的第三个参数应该是CLOB.DURATION_CALL或者CLOB.DURATION_SESSION

标签: java xml spring oracle clob


【解决方案1】:

准备好的语句应该是OracleCallableStatement类型,然后按照下面的示例代码进行操作

        stmt = (OracleCallableStatement) conn.prepareCall("{call MSG(" + repeatQmarks(7) + ")}");
        stmt.setBigDecimal("P_W_EVENT_LOG_KEY", wEventLogKey); //1      P_W_EVENT_LOG_KEY   IN     NUMBER,
        stmt.setString("P_DOMAIN", domain); //2      P_DOMAIN            IN     VARCHAR2,
        stmt.setString("P_EXCPT_CD", sqlExCd); //3      P_EXCPT_CD          IN     VARCHAR2,
        stmt.setString("P_EXCPT_MSG", sqlExMsg); //4      P_EXCPT_MSG         IN     VARCHAR2,
        stmt.setStringForClob("P_PAYLOAD_IN", "My TEST CLOB 1"); //5      P_PAYLOAD_IN        IN     CLOB DEFAULT NULL,
        stmt.setStringForClob("P_PAYLOAD_OUT", "My TEST CLOB 2"); //6      P_PAYLOAD_OUT       IN     CLOB DEFAULT NULL,
        stmt.registerOutParameter("P_RET_CD", java.sql.Types.NUMERIC); //7      P_RET_CD               OUT NUMBER);

注意方法的第 5 和第 6 个参数实际上是字符串

setStringForClob

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2021-01-18
    • 1970-01-01
    • 2016-06-14
    相关资源
    最近更新 更多