Oracle11gr2 将XMLTYPE列数据插入Oracle 11g数据库超过4KB时出错
我试图将XML请求数据插入到XML消息大小超过4KB的表中,收到错误:“ORA-01461:只能为插入到长列中绑定长值”。我将XML请求数据作为字符串数据作为事务的一部分接收,并且由于所使用的服务器(webMethods Integration server 9.0),我在将数据转换为另一种格式方面存在限制。我尝试过以下方法:Oracle11gr2 将XMLTYPE列数据插入Oracle 11g数据库超过4KB时出错,oracle11gr2,xmltype,webmethods,Oracle11gr2,Xmltype,Webmethods,我试图将XML请求数据插入到XML消息大小超过4KB的表中,收到错误:“ORA-01461:只能为插入到长列中绑定长值”。我将XML请求数据作为字符串数据作为事务的一部分接收,并且由于所使用的服务器(webMethods Integration server 9.0),我在将数据转换为另一种格式方面存在限制。我尝试过以下方法: 插入测试表值(xmltype()) 插入测试表值(xmltype().getClobVal()) 插入到testtable值中(TO_CLOB()) 表架构如下所示: d
desc testtable
Name Null Type
------- -------- ---------
XMLDATA NOT NULL XMLTYPE()
表的插入也应该在很短的时间内发生,因为操作是针对每个发送到服务器的请求消息执行的。请提供帮助。这种“匿名PL/SQL块”方法可能有效,但我不确定,因为我没有自己的webmethods来测试它
而不是
insert into testtable
values (xmltype(:1))
试着跑步
declare
l_long long;
l_string varchar2(32767);
begin
l_long := :1;
l_string := l_long;
insert into testtable values (xmltype(l_string));
end;
但是,在处理大于32767(甚至可能大于4000)个字符的XML文档时可能会出现问题。我对上述代码进行了一些修改,现在它可以正常工作,但我不确定原因:
declare
l_long long;
l_clob clob;
begin
l_long := :1;
l_clob := TO_CLOB(l_long);
insert into testtable values (xmltype(l_clob));
dbms_lob.freetemporary(l_clob);
end;
这也适用于4KB以上的XML类型数据@nop77svk-感谢您的指导。默认情况下,wM中的所有内容都定义为字符串。但是在使用适配器连接时,您需要检查输入类型。因此,对于在DB中定义为Long的字段,您需要从wM传递一个Long对象,或者需要在适配器服务中将字段的输入类型设置为string。您还需要检查数据库中定义的大小。如果怀疑大小较大,则将DB中的字段类型改为CLOB。不熟悉“webmethods”,但问题似乎在于它将
insert
语句中的XML数据绑定为(可怕的)long
数据类型。(a)尝试强制它将值绑定为BLOB/CLOB并使用xmltype(:yourBindVariable)
构造函数,或者(b)使用带有long
列的临时表,然后插入。。。从temp表选择到目标表,或者(c)使用匿名PL/SQL块(而不是纯的insert
)将长
转换为xmltype
。我无法假设其中哪一个会起作用,但这至少是一个开始。谢谢@nop77svk-我尝试了xmltype(:yourBindVariable)
它不起作用。我将尝试你的建议(b)和(c),但由于数据库不在我的控制范围内,我可能无法继续。我希望在应用程序代码本身中处理这个问题。如果你不能处理数据库,那么匿名PL/SQL方法可能会奏效。我将用代码为您提供一个答案,因为它需要代码格式。我尝试直接在大小为5.44KB的SQL Developer for XMLdata上运行代码。我得到了一个和以前一样的错误<代码>ORA-01461:只能为插入第7行01461的长列ORA-06512:绑定长值。00000-“只能为插入到长列中绑定长值”很高兴看到它最终成功了。不过需要清理一下。。。删除l_字符串
声明和l_xmltype
声明+赋值。您正在对输入进行两次XML DOM解析。。。这与您所要求的性能效率不符。而且将dbms\u lob.freetimorary(l\u clob)代码>在插入到testtable…
语句下方。@nop77svk-我已经编辑了代码以包含您的建议。谢谢:)