Oracle PL/SQL進階編程(第六彈:使用系統包:DBMS_OUTPUT)

該包使得我們可以從存儲過程、包或觸發器中發送信息。

Oracle推薦在調試PL/SQL程序時使用該包,不建議使用它來做報表輸出或其他的格式化應用。

啓用或禁用DBMS_OUTPUT

默認情況下,Oracle並沒有啓用DBMS_OUTPUT包,也就是說,直接使用DBMS_OUTPUT.PUT_LINEGET_LINE來輸出或獲取消息,是看不到任何輸出的。要先使用DBMS_OUTPUT.ENABLE來啓用包的功能。
DBMS_OUTPUT.ENABLE(buffer_size IN INTEGER DEFAULT 20000);
buffer_size用來指定緩衝區,緩衝區的最大尺寸爲1000000字節 ,最小爲2000字節,默認爲20000字節。

SQL*Plus有一個SET SERVEROUTPUT ON語句,來啓用DBMS_OUTPUT包,如果執行了該語句,則沒有必要使用DBMS_OUTPUT.ENABLE,因爲SET SERVEROUTPUT ON會自動調用該語句。

禁用DBMS_OUTPUT只需要調用DBMS_OUTPUT.DISABLE即可,它同時會清除緩衝區中所有的數據。當執行SET SERVEROUTPUT OFF時,SQL*Plus也會調用DBMS_OUTPUT.DISABLE過程。

向緩衝區中提取與寫入內容

必須要理解的是,DBMS_OUTPUT並不是直接將信息輸出到屏幕,而是將數據寫入到了一個緩衝區中,然後再次將這些輸出讀回。當在SQL*Plus中使用SET SERVEROUTPUT ON命令時,實際上是讓SQL*Plus在每條DBMS_OUTPUT之後檢查緩衝區中的內容,然後在屏幕上進行顯示。

可以使用如下幾個過程來向緩衝區中輸入消息:
- PUT:將信息寫入緩衝區,不包含換行符。
- PUT_LINE:將完整的行信息寫入緩衝區,包含換行符。
- NEW_LINE:在行尾添加換行符。

可以使用如下幾個過程來從緩衝區中提取消息:
- GET_LINE:用於取得緩衝區中的單行信息。
- GET_LINES:用於取得緩衝區中的多行信息。

基本語法如下:

DBMS_OUTPUT.PUT(item IN NUMBER);
DBMS_OUTPUT.PUT(item IN VARCHAR2);
DBMS_OUTPUT.PUT(item IN DATE);
DBMS_OUTPUT.PUT_LINE(item IN NUMBER);
DBMS_OUTPUT.PUT_LINE(item IN VARCHAR2);
DBMS_OUTPUT.PUT_LINE(item IN DATE);
DBMS_OUTPUT.NEW_LINE;
DBMS_OUTPUT.GET_LINE(line OUT VARCHAR2, status OUT INTEGER);
DBMS_OUTPUT.GET_LINES(line OUT CHARARR, numlines IN OUT INTEGER);

PUTPUT_LINE的參數很容易理解,下面說一下GET_LINEGET_LINES的參數。
- line:被GET_LINE取回的行,GET_LINES中的line是一個CHARARR類型,它是一個VARCHAR2(255)的嵌套表,它將返回緩衝區的多行信息的數組。
- status:指出是否取回一行,1表示行參數包含從緩衝區中取回1行,0表示緩衝區爲空,沒有取回數據。
- numlines:它既可以作爲輸入參數,也可以作爲輸出參數。作爲輸入參數表明希望返回的行數,作爲輸出時返回實際取回的行數。如果返回的數字比要求返回的數字少,則表明緩衝區中已經沒有數據了。

演示代碼如下:

DECLARE
   v_line1 VARCHAR(200);                  
   v_line2 VARCHAR(200);      
   v_status NUMBER;
 BEGIN
    DBMS_OUTPUT.ENABLE;                                              --開啓DBMS_OUTPUT
    DBMS_OUTPUT.PUT_LINE('DBMS_OUTPUT主要用於輸出信息,它包含:');  --寫入並換行
    DBMS_OUTPUT.PUT('PUT_LINE');                                     --寫入文本不換行
    DBMS_OUTPUT.PUT(',PUT_LINE');
    DBMS_OUTPUT.PUT(',PUTE');
    DBMS_OUTPUT.PUT(',NEW_LINE');
    DBMS_OUTPUT.PUT(',GET_LINE');
    DBMS_OUTPUT.PUT(',GET_LINES等過程');
    DBMS_OUTPUT.NEW_LINE;                                           --在文本最後加上換行符
    DBMS_OUTPUT.GET_LINE(v_line1,v_status);  
    DBMS_OUTPUT.GET_LINE(v_line2,v_status);                         --獲取緩衝區中的數據行
    DBMS_OUTPUT.PUT_LINE(v_line1);                                  --輸出變量的值到緩衝區
    DBMS_OUTPUT.PUT_LINE(v_line2);       
 END;
 /

緩衝區使用了先進先出(FIFO)算法,最先寫入的最先被讀取。如果一次從緩衝區讀取多行,可以採用GET_LINES,然後循環獲取到行進行顯示:

DECLARE
   v_lines DBMS_OUTPUT.CHARARR;                                     --定義集合類型的變量
   v_status NUMBER;
 BEGIN
    DBMS_OUTPUT.ENABLE;                                             --開啓DBMS_OUTPUT
    DBMS_OUTPUT.PUT_LINE('DBMS_OUTPUT主要用於輸出信息,它包含:');  --寫入並換行
    DBMS_OUTPUT.PUT('PUT_LINE');                                     --寫入文本不換行
    DBMS_OUTPUT.PUT(',PUT_LINE');
    DBMS_OUTPUT.PUT(',PUTE');
    DBMS_OUTPUT.PUT(',NEW_LINE');
    DBMS_OUTPUT.PUT(',GET_LINE');
    DBMS_OUTPUT.PUT(',GET_LINES等過程');
    DBMS_OUTPUT.NEW_LINE;                                           --在文本最後加上換行符     
    DBMS_OUTPUT.GET_LINES(v_lines,v_status);                        --獲取緩衝區中所有的行
    FOR i IN 1..v_status LOOP
       DBMS_OUTPUT.PUT_LINE(v_lines(i));                            --輸出集合中所有的數據行
    END LOOP;   
 END; 
 /
發佈了165 篇原創文章 · 獲贊 47 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章