DBMS_OUTPUT パッケージは、メッセージ (テキスト) をメッセージバッファーに送信したり、メッセージバッファーからメッセージを取得したりする機能を提供しています。 メッセージバッファーは、単一のセッションに対してローカルです。 DBMS_PIPE パッケージを使用して、セッション間でメッセージを送信できます。
下表に、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_SQL パッケージで使用できるパブリック変数を示します。
パブリック変数 | データ型 | 値 | 説明 |
---|---|---|---|
chararr | TABLE | メッセージの行用。 |
CHARARR
CHARARR 変数は、複数のメッセージの行を格納するために使用されます。
TYPE chararr IS TABLE OF VARCHAR2(32767) INDEX BY BINARY_INTEGER;
DISABLE
DISABLE ストアドプロシージャは、メッセージバッファーを空にします。 DISABLE ストアドプロシージャが呼び出されたときのバッファー内のメッセージにはアクセスできなくなります。 その後 PUT、PUT_LINE、または NEW_LINE ストアドプロシージャで送信されたメッセージはすべて破棄されます。 PUT、PUT_LINE、または NEW_LINE ストアドプロシージャが呼び出されると、エラーは送信者に返されず、メッセージの送受信が無効になります。
ENABLE または SERVEROUTPUT(TRUE) ストアドプロシージャを使用して、メッセージの送受信を再度有効にすることができます。
DISABLE
例
以下の無名ブロックは、現在のセッションでのメッセージの送受信を無効にします。
BEGIN
DBMS_OUTPUT.DISABLE;
END;
ENABLE
ENABLE ストアドプロシージャは、メッセージをメッセージバッファーに送信したり、メッセージバッファーからメッセージを受信したりする機能を有効にします。 SERVEROUTPUT(TRUE) を設定すると、ENABLE ストアドプロシージャの暗黙的な呼び出しも実行されます。
SERVEROUTPUT ストアドプロシージャの状況は、PUT、PUT_LINE、または NEW_LINE プロシージャで送信されたメッセージの宛先によって異なります。
- SERVEROUTPUT ストアドプロシージャの最後の状況が TRUE の場合には、メッセージはコマンド行の標準出力に送信されます。
- SERVEROUTPUT ストアドプロシージャの最後の状況が FALSE の場合は、メッセージはメッセージバッファーに送信されます。
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 ストアドプロシージャは、メッセージバッファーからテキストの行を取得する機能を提供しています。 行末文字シーケンスで終了したテキストのみが取得されます。 テキストは、PUT_LINE ストアドプロシージャを使用するか、一連の PUT 呼び出しとそれに続く NEW_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 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 ストアドプロシージャは、メッセージバッファーからコレクションに 1 行以上のテキストを取得する機能を提供しています。 行末文字シーケンスで終了したテキストのみが取得されます。 テキストは、PUT_LINE ストアドプロシージャを使用するか、一連の PUT 呼び出しとそれに続く NEW_LINE 呼び出しによって生成される完全な行です。
GET_LINES(lines OUT CHARARR, numlines IN OUT INTEGER)
パラメーター
パラメーター | 説明 |
---|---|
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 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_LINE
パラメーター
NEW_LINE ストアドプロシージャにはパラメーターは必要ありません。
PUT
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,,10
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,,10
SERVEROUTPUT
SERVEROUTPUT ストアドプロシージャは、メッセージをコマンド行の標準出力またはメッセージバッファーに送る機能を提供しています。 SERVEROUTPUT(TRUE) を設定すると、ENABLE ストアドプロシージャの暗黙的な呼び出しも実行されます。
SERVEROUTPUT ストアドプロシージャのデフォルト設定は、実装によって異なります。 たとえば、Oracle SQL*Plus では、デフォルト設定は SERVEROUTPUT(FALSE) です。 psql では、デフォルト設定は SERVEROUTPUT (TRUE) です。 Oracle SQL*Plus では、この設定は SQL*Plus SET コマンドを使用して制御され、Oracle と互換性のある POLARDB に実装されているストアドプロシージャでは制御されないことにご注意ください。
SERVEROUTPUT(stdout BOOLEAN)
パラメーター
パラメーター | 説明 |
---|---|
stdout | 後続の PUT、PUT_LINE、または NEW_LINE コマンドがコマンドラインの標準出力にテキストを送信するようにするには、このパラメーターを TRUE に設定する必要があります。 メッセージバッファーにテキストを送信するには、このパラメータを FALSE に設定する必要があります。 |
例
以下の無名ブロックは、最初のメッセージをコマンドラインに送信し、2 番目のメッセージをメッセージバッファーに送信します。
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