Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将XML作为CLOB传递给Oracle会导致“ORA-22922:不存在LOB值”错误_Java_Xml_Spring_Oracle_Clob - Fatal编程技术网

Java 将XML作为CLOB传递给Oracle会导致“ORA-22922:不存在LOB值”错误

Java 将XML作为CLOB传递给Oracle会导致“ORA-22922:不存在LOB值”错误,java,xml,spring,oracle,clob,Java,Xml,Spring,Oracle,Clob,我正在构建一个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.C

我正在构建一个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);

请让我知道如何解决这个问题。提前感谢。

准备好的语句应该是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


这可能会对您有所帮助。您还应该了解LOB读取一致性,并确保避免在过程中进行提交或回滚。CLOB.createTemporary的第三个参数应该是CLOB.DURATION\u CALL或CLOB.DURATION\u SESSION。
        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);