dbms_output.put_line长度限制问题
对于10g以上版本(包括10g), dbms_output.put_line的最大长度限制是32767. 如果报错buffer overflow, 执行如下语句即可:
set serveroutput ON SIZE UNLIMITED FORMAT WORD_WRAPPED
对于10g以上版本(包括10g), dbms_output.put_line的最大长度限制是32767. 如果报错buffer overflow, 执行如下语句即可:
set serveroutput ON SIZE UNLIMITED FORMAT WORD_WRAPPED
对于10g以下版本dbms_output.put_line最大长度限制是255.
解决方法 1
Declare
ls_sql Varchar2(2000);
Begin
ls_sql := '123
234
123';
-- 按空格符调用 dbms_output.put_line
for i in 1 .. length(LS_SQL) - length(replace(LS_SQL, ' ')) + 1 loop
dbms_output.put_line(substr(LS_SQL,
instr(' ' || LS_SQL, ' ', 1, i),
instr(LS_SQL || ' ', ' ', 1, i) -
instr(' ' || LS_SQL, ' ', 1, i)));
End loop;
End;
输出结果:
123
234
123
解决方法 2
设置 dbms_output 输出的缓冲。
Enable DBMS_OUTPUT and set the buffer size. The buffer size can be between 1 and 1,000,000
在begin后面加上 DBMS_OUTPUT.ENABLE(buffer_size => null);
Declare
ls_sql Varchar2(2000);
Begin
--set serveroutput on;
--dbms_output.enable(buffer_size >= null);存储过程中可用
DBMS_OUTPUT.ENABLE (20000);--默认值20000 <=100 0000
ls_sql := '123
234
123';
--直接输出
dbms_output.put_line(ls_sql);
End;
结果
123
234
123
---打印超长的clob字符------------------------------------------
declare
c1 clob;
strLog varchar2(2000);--单次输出的临时变量
loopCount number(5);
begin
dbms_output.enable(50000);--设置test window 的dbms output 的buffersize
for i in 1 .. 40000 loop
c1:=c1||i||'test';
end loop;
dbms_output.put_line('length(clob):'||dbms_lob.getlength(c1));
loopCount:=floor(dbms_lob.getlength(c1)/1000);--按1000分块,看能分多少块
dbms_output.put_line('loopCount:'||loopCount);
for i in 0 .. loopCount-1 loop
dbms_output.put_line('loop-----------'||i);
strLog:=substr(c1,i*1000+1,1000);--这里按clob内字符数截取的,每个字符可能是英文字符1byte,也可能是汉字字符2byte
dbms_output.put_line(strLog);
end loop;
--dbms_output.put_line('clob:'||substr(:strlogclob,1,2000));
--注意,测试时要释放clob,但在C#端调用时,要由C#的调用方自行释放
dbms_lob.freetemporary(c1);
dbms_output.put_line('finish-----------');
end;