字符超过32K时,Oracle XMLAGG不起作用

时间:2018-08-02 07:25:37

标签: stored-procedures plsql oracle11g clob

在存储过程中将值分配给声明的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;

1 个答案:

答案 0 :(得分:0)

替换

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