Oracle11gr2 将XMLTYPE列数据插入Oracle 11g数据库超过4KB时出错

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

我试图将XML请求数据插入到XML消息大小超过4KB的表中,收到错误:“ORA-01461:只能为插入到长列中绑定长值”。我将XML请求数据作为字符串数据作为事务的一部分接收,并且由于所使用的服务器(webMethods Integration server 9.0),我在将数据转换为另一种格式方面存在限制。我尝试过以下方法:
  • 插入测试表值(xmltype())
  • 插入测试表值(xmltype().getClobVal())
  • 插入到testtable值中(TO_CLOB())
  • 表架构如下所示:

    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-我已经编辑了代码以包含您的建议。谢谢:)