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;
/