Oracle PL/SQL で STDOUT に出力するより良い方法はありますか?
DBMS_OUTPUT.PUT_LINE は非常に基本的で粗いようです。Python の pprint (Pretty Print) のようなものがあるはずですか?
Oracle PL/SQL で STDOUT に出力するより良い方法はありますか?
DBMS_OUTPUT.PUT_LINE は非常に基本的で粗いようです。Python の pprint (Pretty Print) のようなものがあるはずですか?
PL/SQLは、データを表示するのではなく、データを処理するように設計されています。また、データを呼び出しているクライアントと対話するように設計されています (したがって、たとえば、ユーザー入力のためのメカニズムはありません)。
このDBMS_OUTPUT
パッケージを使用すると、「ストアド プロシージャおよびパッケージからメッセージを送信できます。このパッケージは、PL/SQL のデバッグ情報を表示するのに特に役立ちます」。PL/SQLはそのような作業用に設計されていないため、「きれいな」出力用には設計されていません。また、プロシージャを呼び出すクライアントが DBMS_OUTPUT バッファを参照または表示しない可能性があることを認識しておくことが重要です。
PL/SQL はstdout に何も出力しません。DBMS_OUTPUT 呼び出しは、バッファーへの書き込みを呼び出します (バッファーが有効になっている場合)。PL/SQL の実行が終了すると、クライアントはそのバッファーを読み取って、その内容をどこかに表示できます (有効になっている場合)。これは、実行中には何も表示されず、完了した場合にのみ表示されるため、進行状況を追跡するために使用できないことも意味します。そのため、デバッグの場合でも、常に最適なツールとは限りません。
実行しようとしている内容に応じて、SQL*Plus での見栄えを少し良くすることができます。set serveroutput on format wrapped
これにより、バッファ行の開始時に空白が失われるのを防ぐことができます。しかし、それは通常マイナーな利点です。
より一般的には、プロシージャは、OUT パラメータを介して、または何か有用なものを返す関数にすることによって、その処理の結果を呼び出し元に渡す必要があります。
現在、 を使用してクエリの結果を表示しようとしている場合、dbms_output.put_line
それはお勧めできません。代わりに、コレクションまたは ref カーソルをクライアントに返し、クライアントがそれを表示する方法を心配できるようにすることができます。バインド変数を使用して、SQL*PlusまたはSQL Developerで参照カーソルを簡単に表示できます。
私が知っているビルトインはありません。しかし、ストアド プロシージャ内から結果セットをきれいに出力するプロシージャを作成しました。
proc は print_out_resultset と呼ばれます。使用例:
....
cursor mycur (mynum in number) is
select * from mytable where mycol >= mynum;
myrow mytable%rowtype;
myvar number;
...
begin
....
print_out_resultset(query_string =>
'select * from mytable where mycol >= :b1',
col1 => 'SAM', col2 => 'FRED', col3 => 'ERIC',
b1 => myvar,
maxrows => 4);
open mycur(myvar);
fetch mycur into myrow;
while mycur%found loop
....
例の結果
SQL> set serverout on;
SQL> execute myproc;
SAM FRED ERIC
-----------------------------------
32A 49B 15C
34A 11B 99C
11F 99A 887
77E 88J 976
コードはこちら: http://toolkit.rdbms-insight.com/print_out_resultset.php
何年も前に、これをトラブルシューティングにのみ使用しました。もちろん、本番環境にデプロイする前にテストします
実際には標準的なアプローチがありますが、それは varchar 変数でのみうまく機能します:
declare
v_str varchar2(100):= 'formatted';
v_int int := 10 ;
begin
dbms_output.put_line(
UTL_LMS.FORMAT_MESSAGE('Somebody told that "%s" output works well with '
||'varchar variables, but not with int variables: "%d". '
||'Only with constant integers (%d) it works.'
, v_str, v_int, 100)
);
end;