9

Oracleでトリガーをデバッグするのに問題があります。現在、OracleのSQLDeveloperツールを使用しています。

トリガーをテストするために、テストウィンドウに挿入または削除を書き込みますが、トリガー内で何が起こっているのかがわかりません。トリガーをステップスルーして、トリガーが起動したときに何が起こっているかを確認したいと思います。selectステートメントを使用してトリガー内の変数値を表示する方法はありますか?

4

4 に答える 4

14

まず、「ここから開始」しないでください。具体的には、トリガーを使用しないでください。トリガーが各行に対して起動する場合、トリガーは行レベルの処理への切り替えを強制します。呼び出すストアドプロシージャにロジックを配置することをお勧めします。次に、開始(入力を検証する場所)と終了、およびロジックパスがあります。ストアドプロシージャは、1つのパスをたどると、デバッグがはるかに簡単になります。

次に、処理方法がわからないエラーをテストしないでください。あなたがそれを捕まえない場合、それは何がうまくいかなかったのか(エラーメッセージ)そしてどこで(すなわちエラー/コールスタック)を示すエラーレポートを受け取るクライアントに泡立ちます。あなたがそれを捕まえようとするなら、あなたはそれをどうするかを知らなければなりません(そしてあなたがそれを無視する傾向がわからないなら-それは悪いことです)。

最後に、選択の各「レイヤー」を簡単に確認することはできません。説明計画は、一般的に、それがどのように物事を進めているかを教えてくれます。v $ session_longopsは、現在何をしているかを示す場合があります。現在の待機イベントは、現在作業しているテーブル/ブロック/行に関する手がかりを与える場合があります。

于 2010-09-17T01:56:16.310 に答える
10

トリガーをデバッグする必要がある場合の大まかな簡単な方法は、DBMS_OUTPUTを使用することです。

例えば

SQL> CREATE OR REPLACE TRIGGER mytrigger
     BEFORE UPDATE ON mytable
     FOR EACH ROW
     ...
     BEGIN
       DBMS_OUTPUT.put_line('mytrigger STARTING');
       ... do some logic ...
       DBMS_OUTPUT.put_line('old=' || :OLD.mycolumn);
       DBMS_OUTPUT.put_line('new=' || :NEW.mycolumn);
       DBMS_OUTPUT.put_line('mytrigger FINISHED');
     END;
     /

SQL> SET SERVEROUT ON
SQL> UPDATE mytable SET mycolumn = mycolumn + 1;
2 rows updated.

mytrigger STARTING
old=10
new=11
mytrigger FINISHED
mytrigger STARTING
old=20
new=21
mytrigger FINISHED
于 2010-09-17T02:53:13.710 に答える
1

アプリケーション私は、www.quest.com / toad/toad-for-oracle.aspxで入手可能なTOADと呼ばれるQuestのプログラムを使用しています。

上記のように、DBMS_OUTPUTは非常に便利です。エディターで、必ず[出力]ウィンドウを有効にしてください。

PL / SQLはコードの「ブロック」で機能し、EXCEPTIONキーワードでキャッチできます。

(私のフォーマットを許してください、ウェブ用にフォーマットする方法がわかりません)

DECLARE
    C_DATE_FORMAT VARCHAR2(20) := 'DD-Mon-YYYY';
    C_TIME_FORMAT VARCHAR2(20) := 'HH24:MI:SS';
    C_NOT_IMPLEMENTED_CODE CONSTANT NUMBER(5) := -20200;
    C_NOT_IMPLEMENTED_MESSAGE CONSTANT VARCHAR2(255) := 'Not implemented';
    not_implemented EXCEPTION; -- user defined exception
BEGIN
    --RAISE not_implemented; -- raise user defined exception
    RAISE_APPLICATION_ERROR(C_NOT_IMPLEMENTED_CODE, C_NOT_IMPLEMENTED_MESSAGE); -- user defined exception
EXCEPTION -- exception block
    WHEN not_implemented THEN -- catch not_implemented exception
        DBMS_OUTPUT.PUT_LINE('Error: Not implemented');
    WHEN OTHERS THEN -- catch all other exceptions
        DBMS_OUTPUT.PUT_LINE('Error occured.');
        DBMS_OUTPUT.PUT_LINE('Date: ' || TO_CHAR(SYSDATE, C_DATE_FORMAT));
        DBMS_OUTPUT.PUT_LINE('Time: ' || TO_CHAR(SYSDATE, C_TIME_FORMAT));
        DBMS_OUTPUT.PUT_LINE('Error code: ' || SQLCODE);
        DBMS_OUTPUT.PUT_LINE('Error message: ' || SQLERRM); --deal with error
        RAISE; -- raise to calling object
END;
于 2010-09-17T03:41:12.453 に答える
0

Oracle PL / SQLでDEBUGトリガーを実行するには、以下の手順に従ってください。

  1. [編集]オプションを使用してトリガーを開きます。行番号をクリックしてブレークポイントを設定します(以下を参照)。 ここに画像の説明を入力してください
  2. 以下に示すようにテストウィンドウを開きます。
  3. テーブルの挿入/更新クエリを記述します。(注:トリガーは、更新/挿入、またはその両方で設定できます)
  4. [デバッガの開始]ボタンをクリックします。

ここに画像の説明を入力してください

テーブルの値が更新されるとすぐに。デバッガーがトリガーします。デバッグを続行できる場所。

ここに画像の説明を入力してください

于 2020-11-23T11:02:32.737 に答える