虽然一直在使用DBMS_OUTPUT.PUT_LINE,但是说实话没有仔细研究过DBMS_OUTPUT包中的其他方法和函数的用法,所以这次特地来研究一下。 先简单的讲解一下这个包的所有procedure的含义及作用:
-----------------------
1、enable:在serveroutput on的情况下,用来使dbms_output生效(默认即打开)
2、disable:在serveroutput on的情况下,用来使dbms_output失效
3、put:将内容写到内存,等到put_line时一起输出
4、put_line:将内容写到内存,等到put_line时一起输出(有换行的功效)
5、new_line:作为一行的结束,可以理解为写入buffer时的换行符
6、get_line:获取没有输出的buffer中的信息
7、get_lines:以数组形式来获取所有buffer中的信息
需要注意以下几点:
-----------------------
1、set serveroutput on:如果要在sqlplus中看到dbms_output的输出,则必须设置该参数值为on
2、每行能容纳的最大值是32767bytes
3、buffer的默认值是20000bytes,可设置的最小值为2000bytes,最大值为1000000bytes
下面举几个例子来说明一些不常用的方法的使用:
例子1:(put和new_line)
-----------------------
SQL> set serveroutput on
SQL> begin
2 dbms_output.put_line('three names will be written.');
3 dbms_output.put('j'); --增加至buffer
4 dbms_output.new_line; --回车
5 dbms_output.put('s'); --增加至buffer
6 dbms_output.new_line; --回车
7 dbms_output.put('t'); --增加至buffer
8 dbms_output.new_line; --回车
9 dbms_output.put_line('over.'); --与之前所有一起输出
10 end;
11 /
three names will be written.
j
s
t
over.
PL/SQL procedure successfully completed
例子2:(put_line)
-----------------------
SQL> set serveroutput off;
SQL> create table t(a int,b int,c int);
Table created
SQL> insert into t values(111111,222222,333333);
1 row inserted
SQL> insert into t values(444444,555555,666666);
1 row inserted
SQL> insert into t values(777777,888888,999999);
1 row inserted
SQL> create table tt(a int,b varchar2(100));
Table created
SQL> declare
2 msg varchar2(120);
3 cursor t_cur is select * from t order by a;
4 v_line varchar2(100);
5 v_status integer := 0;
6 begin
7 dbms_output.enable;
8 for i in t_cur loop
9 msg := i.a || ',' || i.b || ',' || i.c;
10 dbms_output.put_line(msg);
11 end loop;
12
13 dbms_output.get_line(v_line,v_status);
14 while v_status = 0 loop
15 insert into tt values(v_status, v_line);
16 dbms_output.get_line(v_line,v_status);
17 end loop;
18 end;
19 /
PL/SQL procedure successfully completed
SQL> select * from tt;
A B
--- ------------------------------
0 111111,222222,333333
0 444444,555555,666666
0 777777,888888,999999
注:使用get_line时不能用put_line输出,因为put_line之后会将buffer清空。(当然在serveroutput off的情况下put_line是不影响buffer的)
例子3:(put_lines)
-----------------------
SQL> set serveroutput on
SQL> declare
2 v_data dbms_output.chararr;
3 v_numlines number;
4 begin
5 -- enable the buffer first.
6 dbms_output.enable(1000000);
7
8 dbms_output.put_line('line one');
9 dbms_output.put_line('line two');
10 dbms_output.put_line('line three');
11
12 v_numlines := 3;
13 dbms_output.get_lines(v_data, v_numlines);
14 for v_counter in 1..v_numlines loop
15 dbms_output.put_line(v_data(v_counter));
16 end loop;
17 end;
18 /
line one
line two
line three
PL/SQL procedure successfully completed