問題と目的:
Oracle開発者は、コードがWebまたは中間層から呼び出されるとき(つまり、開発者セッションが問題が発生するセッションと一致しないとき)に、PL / SQLコードのデバッグの問題に直面することがあります。
データベースとWeb間の2層および3層の相互作用スキームでWeb側で問題が発生した場合は特に重要です(以下は3層相互作用アーキテクチャの例です)。

図1-データベースとWebの相互作用のための3層アーキテクチャ。
問題解決方法:
次のパッケージは、PL / SQLコードのデバッグに関する問題の解決に役立ちます。
- DBMS_PIPE-Oracleデータベースの2つのセッション間でメッセージ(パイプ)を送信できるようにするパッケージ。
- DBMS_ALERT-さまざまなOracleデータベースイベントの非同期アラートのサポートを提供するパッケージ。
以下は、DBMS_PIPEとDBMS_ALERTを同時に使用してデバッグするメソッドのコードです。
create or replace procedure checkout_with_pipe_and_alert(p_cycle_size in number) is c_method_error constant number := -20000; c_method_error_message constant varchar2(4000) := 'Cycle size should be > 0'; l_power_value number; l_i_value number := 1; l_pipe pls_integer; begin if p_cycle_size > 0 then for i in 1 .. p_cycle_size loop l_power_value := power(i, 2); l_i_value := l_i_value * i; --Send pipe info l_pipe := dbms_pipe.create_pipe(pipename => 'pipe'); dbms_pipe.pack_message(i || '.l_power_value:=' || l_power_value || ' l_i_value=' || l_i_value); l_pipe := dbms_pipe.send_message(pipename => 'pipe'); --Send alert info dbms_alert.signal(name => 'alert', message => i || '.l_power_value:=' || l_power_value || ' l_i_value=' || l_i_value); end loop; else raise_application_error(c_method_error, c_method_error_message); end if; end checkout_with_pipe_and_alert;
DBMS_PIPEおよびDBMS_ALERTに許可がない場合、それらを配布します。

図2-Oracle SYSスキーマサーバーから作業スキームへの許可の分配
PL / SQL Developerを使用してDBMS_PIPEおよびDBMS_ALERTのメッセージをキャッチします。
コードを使用してメッセージをキャッチすることは考えません。 Oracle DOCおよびインターネット上の十分な情報。
[ ツール]→[イベントモニター...]に移動し、一方のウィンドウでイベントの種類「 パイプ 」を選択し、もう一方のイベント名の「 アラート 」で、コードで設定したパイプとアラートの名前を示し、 開始をクリックします:

図3-パイプを使用したウィンドウの設定

図4-アラートを含むウィンドウの構成
Web /中間層(この場合は別のセッション)からcheckout_with_pipe_and_alertメソッドを実行した後:
begin checkout_with_pipe_and_alert(5); end;
[パイプ]ウィンドウと[アラート]ウィンドウでは、次の結果が得られます。

図5-パイプから情報を受信した結果

図6-Alertから情報を受信した結果
結論:
- dbms_pipeは、さまざまなセッションでpl / sqlをデバッグするための優れたメソッドです。パイプのみが定期的に詰まっているため、dbms_pipe.purgeメソッドを使用する必要があります。
- dbms_alertの使用はお勧めしません。 デバッグ中にメッセージが定期的に失われます(図6からわかるように)、正しく使用していない可能性があります。 誰かがこれに出くわした場合は、コメントを書いて、記事を修正します。