Java 将XML作为CLOB传递给Oracle会导致“ORA-22922:不存在LOB值”错误
我正在构建一个web服务,它在负载中获取一个输入XML并将其存储在数据库中 在DAO层中,我使用XML字符串创建clob对象,如下所示: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
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);