将 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 11g:从 CLOB 和表更新中读取 XML 记录