CLOB 字符串文字太长
我在这里面临一个问题,想知道是否有一个简单的解决方案,我正在使用下面的PL/SQL代码。目的是迭代一个XML节点,并更新一个表格,其中包含所有内容的内容之间的所有内容。该功能效果很好。
问题是我想处理一个巨大的XML字符串,超过150k行和600万字符。而且,即使应该处理庞大的内容,我也会遇到“字符串刻度太长”错误。因此,我想知道是否有一种简单的方法可以对此进行处理,或者这是否可以在其他地方修改另一种限制?
DECLARE
v_XML_INPUT CLOB := '<xmlString>';
v_COUNT NUMBER;
v_TOTAL_COUNT NUMBER;
v_XML_SECTION CLOB;
v_TEMPLATE_FULL_NAME VARCHAR2(128);
BEGIN
SELECT REGEXP_COUNT(v_XML_INPUT, '<templates>', 1) INTO v_TOTAL_COUNT FROM DUAL;
DBMS_OUTPUT.PUT_LINE(v_TOTAL_COUNT);
v_COUNT := 1;
WHILE v_COUNT <= v_TOTAL_COUNT
LOOP
SELECT REGEXP_SUBSTR(v_XML_INPUT, '(\<templates\W)(.+?)(\</templates\W)',1,v_COUNT,'n') INTO v_XML_SECTION FROM DUAL;
SELECT
xt.TEMPLATE_FULL_NAME
INTO v_TEMPLATE_FULL_NAME
FROM XMLTABLE(
'/templates'
PASSING XMLType(v_XML_SECTION)
COLUMNS TEMPLATE_FULL_NAME VARCHAR2(128) PATH 'templateFullName'
) xt;
DBMS_OUTPUT.PUT_LINE(v_TEMPLATE_FULL_NAME);
UPDATE
TEMPLATES
SET
LAST_UPDATE = SYSDATE,
XML_TEMPLATE_SOURCE = v_XML_SECTION
WHERE TEMPLATE_FULL_NAME = v_TEMPLATE_FULL_NAME;
v_COUNT := v_COUNT +1;
END LOOP;
COMMIT;
END;
预先感谢您的见识:-)
I'm facing an issue here, and wondering if there's an easy solution, I'm using the PL/SQL code below. the goal is to iterate one xml node, and update a table with the content of all which is between the opening and closing of this node. The function works well for that.
Issue is that I want to process a huge XML string, more than 150K lines, and 6M characters. and I get the 'string litteral too long' error, even if a CLOB is supposed to handle huge content. So I'm wondering if there's an easy way to process this anyway, or if this is another type of restriction can be modified elsewhere ?
DECLARE
v_XML_INPUT CLOB := '<xmlString>';
v_COUNT NUMBER;
v_TOTAL_COUNT NUMBER;
v_XML_SECTION CLOB;
v_TEMPLATE_FULL_NAME VARCHAR2(128);
BEGIN
SELECT REGEXP_COUNT(v_XML_INPUT, '<templates>', 1) INTO v_TOTAL_COUNT FROM DUAL;
DBMS_OUTPUT.PUT_LINE(v_TOTAL_COUNT);
v_COUNT := 1;
WHILE v_COUNT <= v_TOTAL_COUNT
LOOP
SELECT REGEXP_SUBSTR(v_XML_INPUT, '(\<templates\W)(.+?)(\</templates\W)',1,v_COUNT,'n') INTO v_XML_SECTION FROM DUAL;
SELECT
xt.TEMPLATE_FULL_NAME
INTO v_TEMPLATE_FULL_NAME
FROM XMLTABLE(
'/templates'
PASSING XMLType(v_XML_SECTION)
COLUMNS TEMPLATE_FULL_NAME VARCHAR2(128) PATH 'templateFullName'
) xt;
DBMS_OUTPUT.PUT_LINE(v_TEMPLATE_FULL_NAME);
UPDATE
TEMPLATES
SET
LAST_UPDATE = SYSDATE,
XML_TEMPLATE_SOURCE = v_XML_SECTION
WHERE TEMPLATE_FULL_NAME = v_TEMPLATE_FULL_NAME;
v_COUNT := v_COUNT +1;
END LOOP;
COMMIT;
END;
Thanks in advance for your insight :-)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问题是您粘贴的 XML 太大,无法存储在 VARCHAR2 中。当您将其粘贴到 PL/SQL 代码中时,它会在转换为 CLOB 之前存储在 VARCHAR2 中。
不要这样做(注意 XML 是如何全部在一个块中):
尝试使用文本编辑器将 XML 行拆分为单独的 VARCHAR2 块(使用 Visual Studio Code 非常简单),然后在分配给 CLOB 时将它们连接在一起:
The problem is that the XML that you are pasting is too large to be stored in a VARCHAR2. When you are pasting it into the PL/SQL code, it is stored in a VARCHAR2 before being converted to a CLOB.
Instead of doing this (notice how the XML is all in one block):
Try splitting the lines of the XML into separate VARCHAR2 blocks with a text editor (very easy with Visual Studio Code), then concatenate them together when assigning to the CLOB: