将 XML 插入 Oracle 中的 XMLTYPE 列时字符串文字太长

Posted

技术标签:

【中文标题】将 XML 插入 Oracle 中的 XMLTYPE 列时字符串文字太长【英文标题】:String literal too long while inserting a XML into XMLTYPE Column in Oracle 【发布时间】:2021-03-17 18:13:19 【问题描述】:

我有一个超过 100K 字符的文本 XML,我正在尝试编写一个 PLSQL 块来将此 XML 插入到 XMLTYPE Oracle 表中。下面是我的 PLSQL 块,它不允许插入 xml 并出现错误说字符串文字太长,因为 Oracle 的 SQL 最多只能处理 4000 个字符。我无法更改 Oracle 中的数据类型。我如何插入这个 XML?

Table Column is REQUEST_XML    XMLTYPE

我一直在尝试这样,但似乎也不起作用。

INSERT INTO XYZ.ABC(ID,REQUEST_XML) values(123,yourXmlStr);

PLSQL 在下面,

DECLARE
yourXmlStr   xmltype := xmltype('<DRIVEResponse TimeZone="EDT">
<Condition1  ActionStep="ABCABC"  /> // This can be more than 100K Characters
</DRIVEResponse>');
BEGIN
  INSERT INTO XYZ.ABC(ID,REQUEST_XML) values(123,XMLTYPE.CREATEXML(yourXmlStr));
COMMIT;
END;

【问题讨论】:

你的表结构是什么?您确定 CreateXML 没有截断它而不是表本身吗? 更新问题。并且没有 CreateXML 没有截断它,我仍然看到 100K 字符 【参考方案1】:

您创建了两次xmltype,这是不必要的。您的源数据是字符串文字(两个单引号之间的任何内容),它在 PL/SQL 中的最大长度为 4000 个字符(或 32767,请参阅MAX_STRING_SIZE)。幸运的是,xmltype 构造函数也可以对clob 进行操作。你没有说源数据来自哪里,所以我不确定构建它的最佳方法:

declare
    l_clob    clob;
    l_xml     xmltype;
begin
    l_clob := '<DRIVEResponse TimeZone="EDT">';
    l_clob := l_clob || '<Condition1  ActionStep="ABCABC"  />';
    ... repeat in chunks of less than 32768 characters ...
    l_clob := l_clob || '</DRIVEResponse>';
    l_xml := xmltype.createxml( l_clob );
    
    INSERT INTO XYZ.ABC(ID,REQUEST_XML) values(123, l_xml);
end;

【讨论】:

所以在调用 Oracle 之前必须在我的服务层中创建 4000 个字符的块? 这将取决于。您可以创建一个clob 并在您的插入语句中使用它与... values(123, XMLTYPE.CREATEXML(:mylob))。我认为这对于将 clob 作为参数的存储过程来说是一个很好的候选者。我不确定是否使用 clob 作为绑定变量;我的印象可能有点挑剔。 @eaolson 根据PL/SQL Program Limits,PL/SQL 中的最大 VARCHAR2 变量大小为 32767 字节。该值必须与 SQL 中 VARCHAR2 的最大大小相同 - 您是对的,它是 4000 或 32767。 真的迂腐,那是string literal,而不是varchar2。它们略有不同,尽管我承认这里的差异主要是学术上的。字符串文字使用空白填充比较,例如字符。

以上是关于将 XML 插入 Oracle 中的 XMLTYPE 列时字符串文字太长的主要内容,如果未能解决你的问题,请参考以下文章

oracle plsql:如何解析 XML 并插入到表中

Oracle 11g:从 CLOB 和表更新中读取 XML 记录

如何将 xml 文件从 Internet 直接导入 Oracle 表

oracle xml 中取时间的问题

使用存储过程把XML文件插入oracle数据库

如何将 PL/SQL 的输出(XML)存储在 oracle 表中