CLOB 字符串文字太长

发布于 2025-01-20 15:52:48 字数 1269 浏览 2 评论 0原文

我在这里面临一个问题,想知道是否有一个简单的解决方案,我正在使用下面的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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

鼻尖触碰 2025-01-27 15:52:48

问题是您粘贴的 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 Code 非常简单),然后在分配给 CLOB 时将它们连接在一起:

DECLARE
    v_XML_INPUT   CLOB
        :=    '<xml>'
           || '    <subelement>'
           || '        <subelement2>123</subelement2>'
           || '    </subelement>'
           || '</xml>';
BEGIN
    NULL;
END;
/

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):

DECLARE
    v_XML_INPUT   CLOB := '<xml>
    <subelement>
        <subelement2>123</subelement2>
    </subelement>
</xml>';
BEGIN
    NULL;
END;
/

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:

DECLARE
    v_XML_INPUT   CLOB
        :=    '<xml>'
           || '    <subelement>'
           || '        <subelement2>123</subelement2>'
           || '    </subelement>'
           || '</xml>';
BEGIN
    NULL;
END;
/
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文