oracle CLOB变量给出“ORA-06502:PL/SQL:数字或值错误”

b1payxdu  于 2023-05-16  发布在  Oracle
关注(0)|答案(2)|浏览(216)

我正在使用PL/SQL Function Body returning SQL query功能在oracle apex上创建一个动态报告。
为此,我只是返回输出。Return Function_name
但我得到错误ORA-06502: PL/SQL: numeric or value error
代码如下:

Create Function Function_Name Return CLOB IS
    Query_1     CLOB;
    Query_2     CLOB;
    Query_3     CLOB;
    CONDITIONS  CLOB;
    FINAL_QUERY CLOB := ' ';
BEGIN

    Query_1 := 'Has query 1';
    Query_2 := 'Has query 2';
    Query_3 := 'Has query 3';
    
    CONDITIONS := 'Has Some conditions';

    Query_1 := Query_1 || ' ' || CONDITIONS;
    Query_2 := Query_2 || ' ' || CONDITIONS;
    Query_3 := Query_3 || ' ' || CONDITIONS;
    
    FINAL_QUERY := Query_1 || ' UNION ' || Query_2 || ' UNION ' || Query_3;
    
    DBMS_OUTPUT.PUT_LINE(length(Query_1));      -- 17k
    DBMS_OUTPUT.PUT_LINE(Query_1);              -- Works fine
    
    DBMS_OUTPUT.PUT_LINE(length(Query_2));      -- 19k
    DBMS_OUTPUT.PUT_LINE(Query_2);              -- Works fine
    
    DBMS_OUTPUT.PUT_LINE(length(Query_3));      -- 19k
    DBMS_OUTPUT.PUT_LINE(Query_3);              -- Works fine
    
    DBMS_OUTPUT.PUT_LINE(length(FINAL_QUERY));  -- 56k
    DBMS_OUTPUT.PUT_LINE(FINAL_QUERY);          -- gives error
END;

当我试图得到FINAL_QUERY时,它给我ORA-06502: PL/SQL: numeric or value error
我试过CONCAT()DBMS_LOB.APPEND。但是FINAL_QUERY给了我同样的错误。ORA-06502: PL/SQL: numeric or value error

--------- With CONCAT ---------
    FINAL_QUERY := CONCAT( CONCAT(Query_1, Query_2), Query_3);
    DBMS_OUTPUT.PUT_LINE(FINAL_QUERY);          -- gives same error

    --------- With APPEND ---------
    DBMS_LOB.APPEND(FINAL_QUERY, Query_1);
    DBMS_OUTPUT.PUT_LINE(FINAL_QUERY);          -- Works fine
    DBMS_LOB.APPEND(FINAL_QUERY, Query_2); 
    DBMS_OUTPUT.PUT_LINE(FINAL_QUERY);          -- gives same error
    
    --DBMS_LOB.APPEND(FINAL_QUERY, Query_3);

注意:我使用DBMS_OUTPUT.PUT_LINE只是为了检查最终结果。我只是想得到一个完整的查询返回。因此,也可以成为可执行从顶点。

5w9g7ksd

5w9g7ksd1#

put_line()过程接受VARCHAR 2参数。
当你传递一个CLOB时,它必须被隐式地转换为该数据类型。当CLOB值很小时,这很好,但是当您超过PL/SQL VARCHAR 2数据类型的32 k大小限制时,转换将失败并出现该错误。
您可以使用substr函数来显示前32 k:

DBMS_OUTPUT.PUT_LINE(DBMS_LOB.SUBSTR(FINAL_QUERY, 32767, 1));

或者更简单地使用默认限制:

DBMS_OUTPUT.PUT_LINE(DBMS_LOB.SUBSTR(FINAL_QUERY));

请记住,大小限制是以字节为单位,而不是以字符为单位(因此,如果您有多字节字符,则需要更短的子字符串)。
如果你真的需要看到整个字符串,那么你需要分成几个更小的块,如果你可以在换行符上拆分,这是相当容易做到的-有很多这样的例子-比如this one

olqngx59

olqngx592#

我假设你不会在屏幕上显示FINAL_QUERY,而是执行它。
因为,我想说你超过了DBMS_OUTPUT.PUT_LINE可以显示的限制。
尝试将其放大到允许的最大值(100万):

exec dbms_output.enable(1000000);

然后运行代码。但是,如果您在完成该过程后不显示它,那也没有什么关系。

相关问题