CLOB 字符串文字太长
CLOB String litteral too long
我遇到了一个问题,想知道是否有简单的解决方案,我正在使用下面的 PL/SQL 代码。目标是迭代一个 xml 节点,并用该节点打开和关闭之间的所有内容更新 table。该函数对此很有效。
问题是我要处理一个巨大的 XML 字符串,超过 150K 行和 6M 字符。我得到 'string litteral too long' 错误,即使 CLOB 应该处理大量内容。所以我想知道是否有一种简单的方法来处理这个问题,或者这是否是可以在其他地方修改的另一种类型的限制?
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;
提前感谢您的见解:-)
问题是您粘贴的 XML 太大,无法存储在 VARCHAR2 中。当您将其粘贴到 PL/SQL 代码中时,它在转换为 CLOB 之前存储在 VARCHAR2 中。
而不是这样做(注意 XML 如何全部在一个块中):
DECLARE
v_XML_INPUT CLOB := '<xml>
<subelement>
<subelement2>123</subelement2>
</subelement>
</xml>';
BEGIN
NULL;
END;
/
尝试使用文本编辑器将 XML 的行拆分为单独的 VARCHAR2 块(使用 Visual Studio 代码非常容易),然后在分配给 CLOB 时将它们连接在一起:
DECLARE
v_XML_INPUT CLOB
:= '<xml>'
|| ' <subelement>'
|| ' <subelement2>123</subelement2>'
|| ' </subelement>'
|| '</xml>';
BEGIN
NULL;
END;
/
我遇到了一个问题,想知道是否有简单的解决方案,我正在使用下面的 PL/SQL 代码。目标是迭代一个 xml 节点,并用该节点打开和关闭之间的所有内容更新 table。该函数对此很有效。
问题是我要处理一个巨大的 XML 字符串,超过 150K 行和 6M 字符。我得到 'string litteral too long' 错误,即使 CLOB 应该处理大量内容。所以我想知道是否有一种简单的方法来处理这个问题,或者这是否是可以在其他地方修改的另一种类型的限制?
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;
提前感谢您的见解:-)
问题是您粘贴的 XML 太大,无法存储在 VARCHAR2 中。当您将其粘贴到 PL/SQL 代码中时,它在转换为 CLOB 之前存储在 VARCHAR2 中。
而不是这样做(注意 XML 如何全部在一个块中):
DECLARE
v_XML_INPUT CLOB := '<xml>
<subelement>
<subelement2>123</subelement2>
</subelement>
</xml>';
BEGIN
NULL;
END;
/
尝试使用文本编辑器将 XML 的行拆分为单独的 VARCHAR2 块(使用 Visual Studio 代码非常容易),然后在分配给 CLOB 时将它们连接在一起:
DECLARE
v_XML_INPUT CLOB
:= '<xml>'
|| ' <subelement>'
|| ' <subelement2>123</subelement2>'
|| ' </subelement>'
|| '</xml>';
BEGIN
NULL;
END;
/