DBMS_OUTPUT パッケージは、メッセージ (テキスト) をメッセージバッファーに送信したり、メッセージバッファーからメッセージを取得したりする機能を提供しています。 メッセージバッファーは、単一のセッションに対してローカルです。 DBMS_PIPE パッケージを使用して、セッション間でメッセージを送信できます。

下表に、DBMS_OUTPUT パッケージで使用可能な関数とストアドプロシージャを示します。

表 1. 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 パッケージで使用できるパブリック変数を示します。

表 2. DBMS_OUTPUT public variables
パブリック変数 データ型 説明
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 ストアドプロシージャは、行末文字シーケンスを含む単一行をメッセージバッファーに書き込みます。
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