【发布时间】:2016-04-21 16:39:16
【问题描述】:
我有一个 Oracle 程序
TEST_XML_PARM_CALLER
调用过程
TEST_XML_PARM_CALLEE(parm1 IN CLOB, parm2 OUT CLOB)
通过 WSO2 ESB、WSO2 DSS。
parm1 是 CLOB 参数,从过程 TEST_XML_PARM_CALLER 发送 XML 内容, parm2 是从过程 TEST_XML_PARM_CALLEE 返回 XML 内容的 CLOB 参数。
从 TEST_XML_PARM_CALLER 到 ESB 到 DSS 到 TEST_XML_PARAM_CALLEE 的调用通过 CLOB 内容是正确的(字符串长度大于 4000), 但是当长度大于 4000 时返回参数(parm2)会引发错误,如下所示
ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 6024, maximum: 4000)
在WSO2 DSS中,配置如下
<data name="test_xml_parm">
<config id="test_db">
<property name="carbon_datasource_name">test_db</property>
</config>
<query id="qry_test_xml_parm" useConfig="test_db">
<sql>call TEST_XML_PARM_CALLEE(?,?)</sql>
<result element="rcd" rowName="row">
<element column="rtn_clob" name="rtn_clob" xsdType="string"/>
</result>
<param name="clob_xml" ordinal="1" sqlType="STRING"/>
<param name="rtn_clob" ordinal="2" sqlType="STRING" type="OUT"/>
</query>
<operation name="op_test_xml_parm">
<call-query href="qry_test_xml_parm">
<with-param name="clob_xml" query-param="clob_xml"/>
</call-query>
</operation>
</data>
谁能告诉我怎么解决?
【问题讨论】:
-
这是由于 LOB 大小大于缓冲区限制。请参考dba-oracle.com/t_ora_22835_buffer_too_small.htm
-
感谢您的回复。但是程序“TEST_XML_PARM_CALLEE”的输入参数(parm1),长度大于4000,没有报错。只是返回参数会将长度限制在4000以内。
-
参考网址:link,将
<sql>call TEST_XML_PARM_CALLEE(?,?)</sql>替换为<sql>{call TEST_XML_PARM_CALLEE(?,?)}</sql>