有时候需要用dbms_output spool出一些脚本,所以很受长度100w个字符这个限制的困扰,但是后来发现在10GR2版本下,buffer已经可以很长很长,而行长可以达到32767个字符,为什么plsql dev里还不行呢,今天有空做了个实验
首先 在plsql dev里打开一个command window
SQL> set serveroutput on size unlimited;
SQL> declare
2 x varchar2(4000);
3 begin
4 x:=rpad('*',250,'*');
5 for i in 1..4000 loop
6 dbms_output.put_line(x);
7 end loop;
8 end;
9 /
ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 32
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 97
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 112
ORA-06512: 在 line 7
我了个去啊!说好的unlimited呢......
好吧还是100w吧
SQL> set serveroutput on size 1000000;
SQL> declare
2 x varchar2(4000);
3 begin
4 x:=rpad('*',250,'*');
5 for i in 1..4000 loop
6 dbms_output.put_line(x);
7 end loop;
8 end;
9 /
PL/SQL procedure successfully completed
哦 好了,100w呢(要是钱就好了.... `ω`)
那么再来一个100w+1?
SQL> set serveroutput on size unlimited;
SQL> declare
2 x varchar2(4000);
3 begin
4 x:=rpad('*',250,'*');
5 for i in 1..4000 loop
6 dbms_output.put_line(x);
7 end loop;
8 dbms_output.put_line('*');
9 end;
10 /
ORA-20000: ORU-10027: buffer overflow, limit of 1000000 bytes
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 32
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 97
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 112
ORA-06512: 在 line 9
真是不负众望的溢出了啊.....
然后打开一个sqlplus
先不做任何限制,只打开显示,直接来个100w+1吧
SQL> set serveroutput on;
SQL> declare
2 x varchar2(4000);
3 begin
4 x:=rpad('*',250,'*');
5 for i in 1..4000 loop
6 dbms_output.put_line(x);
7 end loop;
8 dbms_output.put_line('*');
9 end;
10 /
PL/SQL 过程已成功完成
真是给人一种莫名其妙的挫败感呢......一下就完成了......
恩,实际上就算循环8k次也就是 200w个字符也完全没有问题呢
所以说要spool出一个特别长的脚本的时候 还是sqlplus吧.....
最后是今天的卖萌小故事
oracle 还有plsql dev 之间的三角关系感觉就像
我:亲~
oracle:亲~
plsqldev:...
100w次以后
我:亲~
oracle:亲~
plsqldev:尼玛!亲够了没有啊!老子是死死团的,都给我去死!
ora-剧终