DBMS_OUTPUT包用於向訊息緩衝區發送訊息,或者從訊息緩衝區擷取訊息。
下表列出了DBMS_OUTPUT包允許使用的預存程序和函數。
| 函數/預存程序 | 傳回型別 | 描述 |
| DISABLE | N/A | 禁止訪問緩衝區的訊息。 |
| ENABLE(buffer size) | N/A | 允許訪問緩衝區的訊息。 |
| GET_LINE(line OUT, status OUT) | N/A | 從緩衝區中檢索一行文本。 |
| GET_LINES(lines OUT, numlines IN OUT) | N/A | 從緩衝區中檢索行數組。 |
| NEW_LINE | N/A | 放置一個行結束符。 |
| PUT(item) | N/A | 在緩衝區中放置部分行訊息。 |
| PUT_LINE(item) | N/A | 在緩衝區中放置行訊息。 |
| SERVEROUTPUT(stdout) | N/A | 使用PUT、PUT_LINE或NEW_LINE將訊息直接發送到標準輸出或訊息緩衝區。 |
下表列出了DBMS_OUTPUT包允許使用的公開變數。
| 變數名稱 | 變數類型 | 變數值 | 變數說明 |
| chararr | TABLE | - | 用於儲存多行訊息文本。 |
CHARARR
變數CHARARR用於儲存多行訊息文本。文法如下:
TYPE chararr IS TABLE OF VARCHAR2(32767) INDEX BY BINARY_INTEGER;DISABLE
預存程序DISABLE用於清空訊息緩衝區。在執行預存程序DISABLE時,將不能再訪問任何在緩衝區中的訊息。
您可以使用預存程序
ENABLE或SERVEROUTPUT(TRUE)來重新發送和接收訊息。文法如下:DISABLE樣本BEGIN
DBMS_OUTPUT.DISABLE;
END;ENABLE
預存程序
樣本ENABLE允許向訊息緩衝區發送訊息,或從訊息緩衝區中接收訊息。文法如下:ENABLE [ (buffer_size INTEGER) ]參數| 參數名稱 | 參數說明 |
| buffer_size | 訊息緩衝區的最大長度。以位元組為單位。如果指定的buffer_size小於2000,那麼會自動把它設為2000。 |
下面的匿名代碼塊使訊息傳遞的功能生效。通過設定
SERVEROUTPUT(TRUE),可以強制把訊息送到標準輸出中。BEGIN
DBMS_OUTPUT.ENABLE;
DBMS_OUTPUT.SERVEROUTPUT(TRUE);
DBMS_OUTPUT.PUT_LINE('Messages enabled');
END;
Messages enabled您也可以只通過使用
SERVEROUTPUT(TRUE)實現相同的效果。BEGIN
DBMS_OUTPUT.SERVEROUTPUT(TRUE);
DBMS_OUTPUT.PUT_LINE('Messages enabled');
END;
Messages enabled下面的匿名代碼塊使訊息傳遞的功能生效,通過設定
SERVEROUTPUT(FALSE),可以將訊息送到訊息緩衝區中。BEGIN
DBMS_OUTPUT.ENABLE;
DBMS_OUTPUT.SERVEROUTPUT(FALSE);
DBMS_OUTPUT.PUT_LINE('Message sent to buffer');
END;GET_LINE
使用預存程序
樣本GET_LINE,您可以從訊息緩衝區中擷取一行由行結束符終止的文本。文法如下:GET_LINE(line OUT VARCHAR2, status OUT INTEGER)參數| 參數名稱 | 參數說明 |
| line | 用於從訊息緩衝區接收文本行的變數。 |
| status | 如果從訊息緩衝區返回一行文本,返回0。如果沒有文本返回,返回1。 |
下面的匿名代碼塊,將表
emp中的記錄以逗號分隔,並將分隔後的記錄以字串的形式寫到訊息緩衝區中。EXEC DBMS_OUTPUT.SERVEROUTPUT(FALSE);
DECLARE
v_emprec VARCHAR2(120);
CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
BEGIN
DBMS_OUTPUT.ENABLE;
FOR i IN emp_cur LOOP
v_emprec := i.empno || ',' || i.ename || ',' || i.job || ',' ||
NVL(LTRIM(TO_CHAR(i.mgr,'9999')),'') || ',' || i.hiredate ||
',' || i.sal || ',' ||
NVL(LTRIM(TO_CHAR(i.comm,'9990.99')),'') || ',' || i.deptno;
DBMS_OUTPUT.PUT_LINE(v_emprec);
END LOOP;
END;下面的匿名代碼塊,先從訊息緩衝區中讀取簡訊,再將前一個樣本寫入的訊息寫入到
messages表中,然後顯示訊息中的記錄。CREATE TABLE messages (
status INTEGER,
msg VARCHAR2(100)
);
DECLARE
v_line VARCHAR2(100);
v_status INTEGER := 0;
BEGIN
DBMS_OUTPUT.GET_LINE(v_line,v_status);
WHILE v_status = 0 LOOP
INSERT INTO messages VALUES(v_status, v_line);
DBMS_OUTPUT.GET_LINE(v_line,v_status);
END LOOP;
END;使用SELECT 查詢messages表資訊。SELECT msg FROM messages;顯示結果如下: msg
-----------------------------------------------------------------
7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30
7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30
7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20
7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30
7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30
7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10
7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20
7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10
7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30
7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20
7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30
7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20
7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
(14 rows)GET_LINES
您可以使用預存程序
樣本GET_LINES從訊息緩衝區中擷取多行文本,再將這些文本放到一個集合中。文法如下:GET_LINES(lines OUT CHARARR, numlines IN OUT INTEGER)參數| 參數名稱 | 參數說明 |
| lines | 從訊息緩衝區中接收文本行的表。關於lines的描述,參見變數CHARARR 。 |
| numlines IN | 從訊息緩衝區中取出的文本行數。 |
| numlines OUT | 從訊息緩衝區中實際取出的文本行數量。如果numlines的輸出值小於輸入值,那麼表示在訊息緩衝區中,沒有文本了。 |
樣本中,使用預存程序
GET_LINES將放在訊息緩衝區中emp的記錄存放到一個數組中。EXEC DBMS_OUTPUT.SERVEROUTPUT(FALSE);
DECLARE
v_emprec VARCHAR2(120);
CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
BEGIN
DBMS_OUTPUT.ENABLE;
FOR i IN emp_cur LOOP
v_emprec := i.empno || ',' || i.ename || ',' || i.job || ',' ||
NVL(LTRIM(TO_CHAR(i.mgr,'9999')),'') || ',' || i.hiredate ||
',' || i.sal || ',' ||
NVL(LTRIM(TO_CHAR(i.comm,'9990.99')),'') || ',' || i.deptno;
DBMS_OUTPUT.PUT_LINE(v_emprec);
END LOOP;
END;
DECLARE
v_lines DBMS_OUTPUT.CHARARR;
v_numlines INTEGER := 14;
v_status INTEGER := 0;
BEGIN
DBMS_OUTPUT.GET_LINES(v_lines,v_numlines);
FOR i IN 1..v_numlines LOOP
INSERT INTO messages VALUES(v_numlines, v_lines(i));
END LOOP;
END;使用SELECT 查詢messages表資訊。SELECT msg FROM messages;顯示結果如下: msg
-----------------------------------------------------------------
7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30
7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30
7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20
7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30
7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30
7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10
7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20
7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10
7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30
7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20
7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30
7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20
7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
(14 rows)NEW_LINE
預存程序
NEW_LINE在訊息緩衝區中寫入一個行結束符。文法如下:NEW_LINEPUT
預存程序
樣本PUT將一個字串寫到訊息緩衝區中。您可以使用預存程序NEW_LINE增加一個行結束符。文法如下:PUT(item VARCHAR2)參數| 參數名稱 | 參數說明 |
| item | 寫到訊息緩衝區中文本。 |
下面的樣本使用預存程序
PUT展示了從表emp中查詢出的僱員資訊列表,這些僱員資訊是以逗號分隔方式展現的。DECLARE
CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
BEGIN
FOR i IN emp_cur LOOP
DBMS_OUTPUT.PUT(i.empno);
DBMS_OUTPUT.PUT(',');
DBMS_OUTPUT.PUT(i.ename);
DBMS_OUTPUT.PUT(',');
DBMS_OUTPUT.PUT(i.job);
DBMS_OUTPUT.PUT(',');
DBMS_OUTPUT.PUT(i.mgr);
DBMS_OUTPUT.PUT(',');
DBMS_OUTPUT.PUT(i.hiredate);
DBMS_OUTPUT.PUT(',');
DBMS_OUTPUT.PUT(i.sal);
DBMS_OUTPUT.PUT(',');
DBMS_OUTPUT.PUT(i.comm);
DBMS_OUTPUT.PUT(',');
DBMS_OUTPUT.PUT(i.deptno);
DBMS_OUTPUT.NEW_LINE;
END LOOP;
END;顯示結果如下:7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30
7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30
7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20
7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30
7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30
7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10
7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20
7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10
7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30
7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20
7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30
7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20
7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10PUT_LINE
預存程序
樣本PUT_LINE向訊息緩衝區寫入一行帶有行結束符的文本。 文法如下:PUT_LINE(item VARCHAR2)參數| 參數名稱 | 參數說明 |
| item | 寫入訊息緩衝區的文本。 |
下面的樣本使用預存程序PUT_LINE展示了從emp表中查出的僱員記錄,這些記錄是以逗號分隔列表的形式展現的。
DECLARE
v_emprec VARCHAR2(120);
CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
BEGIN
FOR i IN emp_cur LOOP
v_emprec := i.empno || ',' || i.ename || ',' || i.job || ',' ||
NVL(LTRIM(TO_CHAR(i.mgr,'9999')),'') || ',' || i.hiredate ||
',' || i.sal || ',' ||
NVL(LTRIM(TO_CHAR(i.comm,'9990.99')),'') || ',' || i.deptno;
DBMS_OUTPUT.PUT_LINE(v_emprec);
END LOOP;
END;顯示結果如下:7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30
7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30
7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20
7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30
7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30
7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10
7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20
7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10
7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30
7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20
7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30
7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20
7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10SERVEROUTPUT
預存程序
SERVEROUTPUT將訊息發送到命令列的標準輸出或訊息緩衝區。通過設定SERVEROUTPUT(TRUE),能夠在隱含狀態下執行預存程序ENABLE。SERVEROUTPUT文法如下:SERVEROUTPUT(stdout BOOLEAN)SERVEROUTPUT的預設值取決於實際應用情境。例如:- 在Oracle的SQL*PLUS中預設為
SERVEROUTPUT(FALSE)。說明 在Oracle的SQL*PLUS中,這個預設值是通過SQL*PLUS的SET命令控制。 - 在PSQL中預設為
SERVEROUTPUT(TRUE)。
| 參數名稱 | 參數說明 |
| stdout | 指定PUT、PUT_LINE或NEW_LINE發送訊息的目的地。
|
下面的匿名代碼塊,將第一條資訊發送到命令列的標準輸出,第二條資訊發送到訊息緩衝區。
BEGIN
DBMS_OUTPUT.SERVEROUTPUT(TRUE);
DBMS_OUTPUT.PUT_LINE('This message goes to the command line');
DBMS_OUTPUT.SERVEROUTPUT(FALSE);
DBMS_OUTPUT.PUT_LINE('This message goes to the message buffer');
END;顯示結果如下:This message goes to the command line如果在同一個會話中執行下面的匿名代碼塊,那麼就會將前面樣本中存放在訊息緩衝區的訊息做為一條新的資訊在命令列上顯示出來。BEGIN
DBMS_OUTPUT.SERVEROUTPUT(TRUE);
DBMS_OUTPUT.PUT_LINE('Flush messages from the buffer');
END;顯示結果如下:This message goes to the message buffer
Flush messages from the buffer