該包使得我們可以從存儲過程、包或觸發器中發送信息。
Oracle推薦在調試PL/SQL程序時使用該包,不建議使用它來做報表輸出或其他的格式化應用。
啓用或禁用DBMS_OUTPUT
默認情況下,Oracle並沒有啓用DBMS_OUTPUT
包,也就是說,直接使用DBMS_OUTPUT.PUT_LINE
或GET_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);
PUT
和PUT_LINE
的參數很容易理解,下面說一下GET_LINE
和GET_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;
/