我实现了一个返回 clob 数据类型的函数,我想在 DBMS输出中打印结果。不幸的是,我得到 ORA-06502:PL / SQL:数字或值错误,我认为这是由于DBMS_OUTPUT的大小。
这是代码。
DECLARE
TYPE tp_col_array IS TABLE OF varchar2(32767);
FUNCTION my_fn (
p_in_proc_date IN varchar2)
RETURN clob AS
vr_output_str clob;
BEGIN
-- Detailed code hidden due to privacy. Sorry
RETURN vr_output_str;
EXCEPTION
WHEN LOGIN_DENIED
THEN
DBMS_OUTPUT.PUT_LINE('Invalid username/password: logon denied');
RETURN 'TEST Terminated';
END my_fn;
BEGIN
DBMS_OUTPUT.PUT_LINE(my_fn('31-AUG-14'));
END;
以下是可以帮助您理解此问题的内容 1)添加以下内容以设置缓冲区无限的大小,但不起作用..
DBMS_OUTPUT.ENABLE(NULL);
或
set serveroutput on size unlimited;
相关链接:http://www.oracle-developer.net/display.php?id=327
2)值得注意的是,vr_output_str的大小为 75387 ,这就是返回类型为 CLOB 的原因。
DBMS_LOB.getlength(vr_output_str); // =75387
3)我可以通过以下方式解决问题,但我认为这不是一个好的解决方案,因为它执行了三次这个功能。
DBMS_OUTPUT.PUT_LINE(SUBSTR(my_fn ('31-AUG-14'), 1, 32767));
DBMS_OUTPUT.PUT_LINE(SUBSTR(my_fn ('31-AUG-14'), 32768, 32767));
DBMS_OUTPUT.PUT_LINE(SUBSTR(my_fn ('31-AUG-14'), 65536, 32767));
4)我正在使用 Oracle Database 11g企业版11.2.0.3.0版 - 64位生产
答案 0 :(得分:2)
如果它大于32767字节,则无法直接使用dbms_output.put_line打印clob。
如果是这种情况,您可以创建一个迭代clob的过程,并一次打印出一个较小的块。这样的程序和测试脚本如下:
declare
c clob;
procedure print_clob( p_clob in clob ) is
v_offset number default 1;
v_chunk_size number := 10000;
begin
loop
exit when v_offset > dbms_lob.getlength(p_clob);
dbms_output.put_line( dbms_lob.substr( p_clob, v_chunk_size, v_offset ) );
v_offset := v_offset + v_chunk_size;
end loop;
end print_clob;
begin
for i in 1..10000 loop
c := c || 'test';
end loop;
--This will result in ora-06502
--dbms_output.put_line(c);
print_clob(c);
end;
请注意,v_chunk_size必须导致少于32767个字节一次被分块。如果编码每个字符有2个字节,则需要使用(32767/2)。
答案 1 :(得分:0)
以下程序会更好:
PROCEDURE print_clob( p_clob in clob ) IS v_offset number default 1; v_chunk_size number := 255; BEGIN LOOP EXIT when v_offset > dbms_lob.getlength(p_clob); dbms_output.put( dbms_lob.substr( p_clob, v_chunk_size, v_offset ) ); v_offset := v_offset + v_chunk_size; END LOOP; DBMS_OUTPUT.NEW_LINE; END print_clob;