すべてのプロダクト
Search
ドキュメントセンター

PolarDB:DBMS_OUTPUT

最終更新日:Jun 05, 2024

DBMS_OUTPUTパッケージは、メッセージバッファへのメッセージの送信またはメッセージの取得に使用されます。

次の表に、DBMS_OUTPUTパッケージで使用できる関数とストアドプロシージャを示します。
表1. DBMS OUTPUTパッケージの関数とストアドプロシージャ
関数またはストアドプロシージャ戻り値の型説明
DISABLEN/Aメッセージを送受信する機能を無効にします。
ENABLE (バッファサイズ)N/Aメッセージを送受信する機能を有効にします。
GET_LINE (ラインOUT、ステータスOUT)N/Aメッセージバッファからテキストの行を取得します。
GET_LINES (ラインOUT、numlines IN OUT)N/Aメッセージバッファから複数行のテキストを取得します。
NEW_LINEN/A行末シーケンスを挿入します。
PUT(item)N/Aメッセージバッファに行末のシーケンスを含まない部分行を挿入します。
PUT_LINE (アイテム)N/A行の終わりのシーケンスを含む完全な行をメッセージバッファに挿入します。
SERVEROUTPUT(stdout)N/APUTPUT_LINE、またはNEW_LINEからのメッセージを標準出力またはメッセージバッファーに転送します。
次の表に、DBMS_OUTPUTパッケージで使用できるパブリック変数を示します。
表2. DBMS_OUTPUTパッケージのパブリック変数
変数可変タイプ変数値説明
chararrテーブル-複数のメッセージ行を格納します。

CHARARR

CHARARR変数は、複数のメッセージ行を格納するために使用されます。 構文:
TYPE chararr IS TABLE OF VARCHAR2(32767) INDEX BY BINARY_INTEGER;

DISABLE

DISABLEストアドプロシージャは、メッセージバッファをクリアするために使用される。 DISABLEストアドプロシージャを呼び出すと、メッセージバッファ内のメッセージにアクセスできません。

ENABLEまたはSERVEROUTPUT(TRUE) ストアドプロシージャを使用して、メッセージの送受信を再度有効にすることができます。 構文: BEGINの
DISABLE

    DBMS_OUTPUT.DISABLE;
エンド; 

ENABLE

ENABLEストアドプロシージャは、メッセージバッファとの間でメッセージを送受信する機能を有効にするために使用されます。 構文:
ENABLE [ (buffer_size INTEGER) ]
パラメーター
パラメーター説明
buffer_sizeメッセージバッファの最大サイズを指定します。 単位:バイト buffer_sizeパラメーターの指定値が2,000未満の場合、パラメーターは自動的に2,000に設定されます。
以下の無名ブロックは、メッセージの送受信を可能にします。 SERVEROUTPUT(TRUE) ストアドプロシージャは、メッセージを標準出力に強制するように構成されています。
BEGIN
    DBMS_OUTPUT.ENABLE;
    DBMS_OUTPUT.SERVEROUTPUT(TRUE);
    DBMS_OUTPUT.PUT_LINE (「メッセージ有効」);
エンド;

メッセージ有効 
同じ効果を得るために、SERVEROUTPUT(TRUE) ストアドプロシージャのみを使用することもできます。
BEGIN
    DBMS_OUTPUT.SERVEROUTPUT(TRUE);
    DBMS_OUTPUT.PUT_LINE (「メッセージ有効」);
エンド;

メッセージ有効 
以下の無名ブロックは、メッセージの送受信を可能にします。 ただし、SERVEROUTPUT (FALSE) ストアドプロシージャを呼び出して、メッセージをメッセージバッファーに送信できます。
BEGIN
    DBMS_OUTPUT.ENABLE;
    DBMS_OUTPUT.SERVEROUTPUT(FALSE);
    DBMS_OUTPUT.PUT_LINE (「バッファに送信されたメッセージ」);
エンド; 

GET_LINE

GET_LINEストアドプロシージャは、行の終わりのシーケンスを持つテキストの行をメッセージバッファから取得するために使用されます。 構文:
GET_LINE(line OUT VARCHAR2, status OUT INTEGER)
パラメータ
パラメーター説明
メッセージバッファからテキスト行を受け取るために使用される変数を指定します。
statusメッセージバッファから1行のテキストが返された場合、0が返されます。 テキストが返されない場合は、1が返されます。
次の匿名ブロックは、empテーブルをコンマ区切りのリストに変換し、そのリストを文字列としてメッセージバッファに書き込みます。
EXEC DBMS_OUTPUT.SERVEROUTPUT(FALSE);

DECLARE
    v_emprec        VARCHAR2(120);
    CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
開始
    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);
    エンドループ;
エンド; 
次の匿名ブロックは、メッセージバッファを読み取り、上記の例で記述されたメッセージをmessagesという名前のテーブルに挿入します。 メッセージテーブルのテキスト行が表示されます。
CREATE TABLEメッセージ (
    status          INTEGER,
    msg VARCHAR2(100)
);

DECLARE
    v_line          VARCHAR2(100);
    v_status INTEGER := 0;
開始
    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; 
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、ミラー、クレア、7782,23-1月-82 00:00:00,1300.00,,10
(14行) 

GET_LINES

GET_LINESストアドプロシージャは、1行以上のテキストをメッセージバッファーからコレクションに取得するために使用されます。 構文:
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;
開始
    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);
    エンドループ;
エンド;

DECLARE
    v_lines         DBMS_OUTPUT.CHARARR;
    v_numlines      INTEGER := 14;
    v_status INTEGER := 0;
開始
    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; 
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、ミラー、クレア、7782,23-1月-82 00:00:00,1300.00,,10
(14行) 

NEW_LINE

NEW_LINEストアドプロシージャは、行の終わりのシーケンスをメッセージバッファに書き込むために使用されます。 構文:
NEW_LINE

PUT

PUTストアドプロシージャは、文字列をメッセージバッファに書き込むために使用されます。 NEW_LINEストアドプロシージャを使用して、行末シーケンスを追加できます。 構文:
PUT(item VARCHAR2)
パラメータ
パラメーター説明
項目メッセージバッファに書き込むテキストを指定します。
次の例では、PUTストアドプロシージャを使用して、empテーブルの従業員のコンマ区切りリストを表示します。
DECLARE
    CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
開始
    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; 
次の出力が表示されます。
7369、SMITH、CLERK、7902,17-DEC-80 00:00:00、800.00、20
7499、アレン、サレスマン、7698、20-FEB-81 00:00:00、1600.00、300.00、30
7521、ワード、サリーマン、7698、22-FEB-81 00:00:00、1250.00、500.00、30
7566、ジョーンズ、マネージャー、7839,02-APR-81 00:00:00、2975.00、、20
7654、マーティン、サリーマン、7698、28-SEP-81 00:00:00、1250.00、1400.00、30
7698、BLAKE、マネージャー、7839,01-5月-81 00:00:00、2850.00、、30
7782、クラーク、マネージャー、7839,09-JUN-81 00:00:00,2450.00,,10
7788、スコット、アナリスト、7566、19-APR-87 00:00:00、3000.00、20
7839、キング、大統領、17-NOV-81 00:00:00、5000.00、10
7844、ターナー、サリーマン、7698、08-SEP-81 00:00:00、1500.00、0.00、30
7876、ADAMS、CLERK、7788,23-5月-87 00:00:00、1100.00、20
7900、ジェームズ、クレルク、7698,03-DEC-81 00:00:00、950.00、、30
7902、フォード、アナリスト、7566,03-DEC-81 00:00:00,3000.00,,20
7934、ミラー、クレア、7782,23-1月-82 00:00:00,1300.00,,10 

PUT_LINE

PUT_LINEストアドプロシージャは、行の終わりのシーケンスを持つテキストの行をメッセージバッファに書き込むために使用されます。 構文:
PUT_LINE(item VARCHAR2)
パラメータ
パラメーター説明
項目メッセージバッファに書き込むテキストを指定します。

次の例では、PUT_LINEストアドプロシージャを使用して、empテーブルから取得した従業員のコンマ区切りリストを表示します。

DECLARE
    v_emprec        VARCHAR2(120);
    CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
開始
    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; 
次の出力が表示されます。
7369、SMITH、CLERK、7902,17-DEC-80 00:00:00、800.00、20
7499、アレン、サレスマン、7698、20-FEB-81 00:00:00、1600.00、300.00、30
7521、ワード、サリーマン、7698、22-FEB-81 00:00:00、1250.00、500.00、30
7566、ジョーンズ、マネージャー、7839,02-APR-81 00:00:00、2975.00、、20
7654、マーティン、サリーマン、7698、28-SEP-81 00:00:00、1250.00、1400.00、30
7698、BLAKE、マネージャー、7839,01-5月-81 00:00:00、2850.00、、30
7782、クラーク、マネージャー、7839,09-JUN-81 00:00:00,2450.00,,10
7788、スコット、アナリスト、7566、19-APR-87 00:00:00、3000.00、20
7839、キング、大統領、17-NOV-81 00:00:00、5000.00、10
7844、ターナー、サリーマン、7698、08-SEP-81 00:00:00、1500.00、0.00、30
7876、ADAMS、CLERK、7788,23-5月-87 00:00:00、1100.00、20
7900、ジェームズ、クレルク、7698,03-DEC-81 00:00:00、950.00、、30
7902、フォード、アナリスト、7566,03-DEC-81 00:00:00,3000.00,,20
7934、ミラー、クレア、7782,23-1月-82 00:00:00,1300.00,,10 

SERVEROUTPUT

SERVEROUTPUTストアドプロシージャを使用して、メッセージをコマンドラインの標準出力またはメッセージバッファに転送します。 SERVEROUTPUT(TRUE) ストアドプロシージャを設定した後、ENABLEストアドプロシージャを暗黙的に呼び出すことができます。 構文:
SERVEROUTPUT(stdout BOOLEAN)
SERVEROUTPUTストアドプロシージャのデフォルト設定は、実装に依存します。 例:
  • Oracle SQL * Plusのデフォルト設定はSERVEROUTPUT(FALSE) です。
    説明 この設定は、PolarDBで実装されているストアドプロシージャではなく、SQL * Plus SETコマンドを使用して制御されます。
  • PSQLでは、デフォルト設定はSERVEROUTPUT (TRUE) です。
パラメーター
パラメーター説明
stdoutPUTPUT_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 (「このメッセージはメッセージバッファに送られます」);
END; 
次の出力が表示されます。
このメッセージはコマンドライン
に移動します。同じセッション内で次の匿名ブロックを実行すると、前の例でメッセージバッファーに格納されたメッセージが新しいメッセージとしてコマンドラインに表示されます。
BEGIN
    DBMS_OUTPUT.SERVEROUTPUT(TRUE);
    DBMS_OUTPUT.PUT_LINE (「バッファからのメッセージのフラッシュ」);
END; 
次の出力が表示されます。
このメッセージはメッセージバッファに移動します。バッファ
からメッセージをフラッシュする