【问题标题】:Oracle XMLAGG doesn't work when characters are more than 32K当字符超过 32K 时 Oracle XMLAGG 不起作用
【发布时间】:2019-01-09 21:13:02
【问题描述】:

在为存储过程中声明的 clob 变量赋值时出现以下错误。当我在 SQL Developer 上运行查询时,同样的事情。

这是我目前在存储过程中使用的查询:

SELECT 
    RTRIM(XMLAGG(XMLELEMENT(E, col1, chr(10)).EXTRACT('//text()')).GetClobVal(),',') 
        INTO CLOB_VAR 
FROM Table1**

我不明白为什么它会导致诸如数字或值错误之类的错误。

错误报告-

ORA-06502:PL/SQL:数字或值错误
ORA-06512:在“XXXXXX.TMP_STORED_PROC”,第 39 行
ORA-06512:在第 1 行
06502. 00000 - “PL/SQL:数值或数值错误%s”
*原因:算术、数字、字符串、转换或约束错误 发生了。例如,如果尝试 将值 NULL 分配给声明为 NOT NULL 的变量,或者如果 尝试将大于 99 的整数分配给变量 声明为 NUMBER(2)。
*行动:改变数据,它是如何被操纵的,或者它是如何声明的 值不违反约束。

存储过程:

create or replace PROCEDURE TMP_STORE_PROC  () IS
    CLOB_TEXT CLOB;
    start_timestamp TIMESTAMP WITH TIME ZONE := SYSTIMESTAMP;
    ERR_CODE VARCHAR2(20);
    ERR_MSG VARCHAR2(500);
    BEGIN
        SAVEPOINT startTransaction;

        SELECT RTRIM(XMLAGG(XMLELEMENT(E, col1, chr(10)).EXTRACT('//text()')).GetClobVal(),',') INTO CLOB_TEXT FROM Table1

        DBMS_OUTPUT.PUT_LINE('################ String length -- '||TO_CHAR(CLOB_TEXT));

        COMMIT;
      NULL;
     EXCEPTION 
        WHEN OTHERS THEN
            ERR_CODE := SQLCODE;
            ERR_MSG := SQLERRM;
            DBMS_OUTPUT.PUT_LINE('Stored procedure failed in execution. Error Message : '||ERR_CODE||' -- MSG --  '||ERR_MSG);
            ROLLBACK TO startTransaction;
            RAISE;
    END;

【问题讨论】:

  • 我无法使用一些虚拟数据进行复制。您能否包含一个演示该问题的 MCVE?或者至少是你的程序代码。
  • 我已经添加了商店过程代码。
  • 嗯,我希望这将有助于确定第 39 行实际上是哪一行,但由于这似乎是您实际代码的一小部分,所以它不是 APP_IDS 是什么?如果那是真正的 CLOB 变量,那么 dbms_output 行可能是真正的罪魁祸首;消息文本暗示您想要长度,而不是整个字符串,不管它是什么。
  • APP_IDS -- 拼写错误。它是 CLOB_TEXT 即使我删除了 DBMS_OUTPUT,错误仍然存​​在。
  • @AshishMishra 我能够在 11g 数据库中重现相同的错误。正如Alex所说,删除DBMS_OUTPUT,错误就消失了。

标签: stored-procedures plsql oracle11g clob


【解决方案1】:

替换

DBMS_OUTPUT.PUT_LINE('################ String length -- '||TO_CHAR(CLOB_TEXT));

以下

DBMS_OUTPUT.put_line ( '################ String length -- ' || length(clob_text)); 

程序

CREATE OR REPLACE PROCEDURE tmp_store_proc
IS
   clob_text         CLOB;
   start_timestamp   TIMESTAMP WITH TIME ZONE := SYSTIMESTAMP;
   err_code          VARCHAR2 (20);
   err_msg           VARCHAR2 (500);
BEGIN
   SAVEPOINT starttransaction;

   SELECT RTRIM (
             XMLAGG (XMLELEMENT (e, col1, CHR (10)).EXTRACT ('//text()')).getclobval (),
             ',')
     INTO clob_text
     FROM table1;


   DBMS_OUTPUT.put_line (
      '################ String length -- ' || LENGTH (clob_text));

   COMMIT;
   NULL;
EXCEPTION
   WHEN OTHERS
   THEN
      err_code := SQLCODE;
      err_msg := SQLERRM;
      DBMS_OUTPUT.put_line (
            'Stored procedure failed in execution. Error Message : '
         || err_code
         || ' -- MSG --  '
         || err_msg);
      ROLLBACK TO starttransaction;
      RAISE;
END;

执行程序

exec tmp_store_proc

输出

########## 字符串长度 -- 18224744

如果您想打印 CLOB,请查看this

【讨论】:

    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 2021-03-23
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多