DBMS_OUTPUTパッケージは、メッセージバッファへのメッセージの送信またはメッセージの取得に使用されます。
次の表に、DBMS_OUTPUTパッケージで使用できる関数とストアドプロシージャを示します。
関数またはストアドプロシージャ | 戻り値の型 | 説明 |
DISABLE | N/A | メッセージを送受信する機能を無効にします。 |
ENABLE (バッファサイズ) | N/A | メッセージを送受信する機能を有効にします。 |
GET_LINE (ラインOUT、ステータスOUT) | N/A | メッセージバッファからテキストの行を取得します。 |
GET_LINES (ラインOUT、numlines IN OUT) | N/A | メッセージバッファから複数行のテキストを取得します。 |
NEW_LINE | N/A | 行末シーケンスを挿入します。 |
PUT(item) | N/A | メッセージバッファに行末のシーケンスを含まない部分行を挿入します。 |
PUT_LINE (アイテム) | N/A | 行の終わりのシーケンスを含む完全な行をメッセージバッファに挿入します。 |
SERVEROUTPUT(stdout) | N/A | PUT 、PUT_LINE 、またはNEW_LINE からのメッセージを標準出力またはメッセージバッファーに転送します。 |
次の表に、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 * PlusSET
コマンドを使用して制御されます。 - PSQLでは、デフォルト設定は
SERVEROUTPUT (TRUE)
です。
パラメーター | 説明 |
stdout | PUT 、PUT_LINE 、またはNEW_LINE ストアドプロシージャを呼び出して送信されるメッセージの宛先を指定します。 有効な値:
|
次の匿名ブロックは、最初のメッセージをコマンドラインの標準出力に送信し、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;
次の出力が表示されます。このメッセージはメッセージバッファに移動します。バッファ
からメッセージをフラッシュする