CLOB字符串太长



我在这里遇到了一个问题,想知道是否有一个简单的解决方案,我使用下面的PL/SQL代码。目标是迭代一个xml节点,并用该节点打开和关闭之间的所有内容更新一个表。该函数对此效果良好。

问题是,我想处理一个巨大的XML字符串,超过150K行和6M个字符。并且我得到了"字符串太长"的错误,即使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, '(<templatesW)(.+?)(</templatesW)',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;
/

最新更新