21

実行に数分かかる可能性のある多数の pl/sql プロシージャがあります。それらを開発している間、私はいくつかの印刷ステートメントを追加して、デバッグを支援し、フィードバックと進行状況のインジケーターも提供しました。最初に、これらを小さなテスト セットで実行したところ、出力はほぼ瞬時に得られました。実行に数分かかる大規模なテスト セットをテストしているので、手順が終了するまで何も出力されないため、コンソールへの出力はもはや適切ではないことがわかりました。私は、出力をバッファリングしてすぐに印刷しない環境で作業することに慣れており、簡単なデバッグと診断のために簡単な print-statement を追加するのが一般的です。

pl/sql で出力をすぐに (バッファリングせずに) 印刷することは可能ですか? そうでない場合、人々は同様の結果を得るためにどのような代替手段を推奨していますか?

4

8 に答える 8

18

次のような自律型トランザクションを使用して、テーブルにメッセージを書き込むプロシージャを作成できます。

procedure log (p_message)
is
    pragma autonomous_transaction;
begin
    insert into message_log (user, datetime, message)
    values (user, sysdate, p_message);
    commit;
end;

次に、別の Oracle セッションからテーブルを監視します。

于 2009-11-13T15:14:43.573 に答える
9

これにはちょっとしたコツがあります。

DBMS_APPLICATION_INFO.set_client_info(" some information here"); を使用できます。いくつかの変数を作成し、" " 内の文字列を置き換えます。

select client_info from v$session を使用して進行状況を監視します。

于 2009-11-13T15:11:11.403 に答える
2

私はこの目的のためにdbms_pipeを使用してきました。名前付きパイプにメッセージを送信し、別のセッションからメッセージを読み取ります。この方法は、書き込みプロセスと読み取りプロセスが別のノードに接続する可能性がある場合、RAC環境では機能しない可能性があります。

または、「pragmaautonomous_transaction」を使用して独自のセッションで実行されるプロシージャを使用してメッセージをテーブルに挿入することもできます。別のセッションからこれらのメッセージをクエリできます

編集:私の2番目のオプションはすでに言及されているようです。

于 2009-11-16T14:33:21.940 に答える
1

別の方法は、ロギング情報を返すパイプライン関数を使用することです。例については、こちらを参照してください。http: //berxblog.blogspot.com/2009/01/pipelined-function-vs-dbmsoutput.htmlパイプライン関数を使用する場合、別のSQLPLUS / Toad/sql開発者などを使用する必要はありません。 ...セッション。

于 2009-11-13T18:43:15.183 に答える
1

PL/SQL Developer の DBMS Pipe と Pipe Viewer を使用して、すべての情報をパイプに入れるときに非同期に取得できます。

誰かがそれを読むときだけ、物をパイプに入れるように注意してください。そうしないと、パイプがいっぱいになると呼び出しが失敗します。

イベントを使用する可能性もあります。PL/SQL Developer にはイベント モニターもあります。そして、ドキュメントはそれを行う方法の例を提供する必要があります。

于 2009-11-16T14:38:36.127 に答える
1

通常、次の 2 つのオプションがあります。

  • 出力を Oracle テーブル (または一時テーブル) に送信します。
  • UTL_FILE を使用して (データベース ホスト) ファイルシステムに書き込みます

OS からデータベース ホストにアクセスできない場合でも、dbhost ファイルシステムに書き込み、Oracle の外部定義テーブルをファイルにバインドして、SELECT でクエリできるようにすることができます。

于 2009-11-13T15:12:17.797 に答える
1

クライアントツールに依存する場合があります。しばらく SQL*Plus を使用していませんが、PL/SQL Developer でプロシージャをデバッグするときは、コマンド ウィンドウを開いてコマンドを発行しSET SERVEROUTPUT ONます。次に、プロシージャを実行すると、出力されたものDBMS_OUTPUT.PUT_LINEがすぐに表示されます。

編集:そうです、私はそれを大量の出力または何かでしか見ていなかったと思います。とにかく、オンラインで検索を行ったところ、このlog4plsqlに出くわしました-役に立つかもしれません。

于 2009-11-13T15:51:30.993 に答える
0

もう 1 つのオプションは、PL/SQL でプロシージャを呼び出して、ログ メッセージを含む電子メールを送信することです。これには、UTL_SMTP を使用して追加できるメール送信機能がデータベースにある必要があります。

于 2010-02-17T22:29:51.153 に答える