1

Oracle PL/SQL で STDOUT に出力するより良い方法はありますか?

DBMS_OUTPUT.PUT_LINE は非常に基本的で粗いようです。Python の pprint (Pretty Print) のようなものがあるはずですか?

4

6 に答える 6

5

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で参照カーソルを簡単に表示できます。

于 2016-05-23T17:31:23.157 に答える
1

私が知っているビルトインはありません。しかし、ストアド プロシージャ内から結果セットをきれいに出力するプロシージャを作成しました。

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

何年も前に、これをトラブルシューティングにのみ使用しました。もちろん、本番環境にデプロイする前にテストします

于 2016-05-23T20:28:55.393 に答える
1

実際には標準的なアプローチがありますが、それは 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;
于 2016-05-24T08:54:58.197 に答える