DBMS_OUTPUT包學習

sudn發表於2012-02-06

雖然一直在使用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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16860121/viewspace-715656/,如需轉載,請註明出處,否則將追究法律責任。

相關文章