我正在使用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只是为了检查最终结果。我只是想得到一个完整的查询返回。因此,也可以成为可执行从顶点。
2条答案
按热度按时间5w9g7ksd1#
put_line()
过程接受VARCHAR 2参数。当你传递一个CLOB时,它必须被隐式地转换为该数据类型。当CLOB值很小时,这很好,但是当您超过PL/SQL VARCHAR 2数据类型的32 k大小限制时,转换将失败并出现该错误。
您可以使用
substr
函数来显示前32 k:或者更简单地使用默认限制:
请记住,大小限制是以字节为单位,而不是以字符为单位(因此,如果您有多字节字符,则需要更短的子字符串)。
如果你真的需要看到整个字符串,那么你需要分成几个更小的块,如果你可以在换行符上拆分,这是相当容易做到的-有很多这样的例子-比如this one。
olqngx592#
我假设你不会在屏幕上显示
FINAL_QUERY
,而是执行它。因为,我想说你超过了
DBMS_OUTPUT.PUT_LINE
可以显示的限制。尝试将其放大到允许的最大值(100万):
然后运行代码。但是,如果您在完成该过程后不显示它,那也没有什么关系。