Oracleでトリガーをデバッグするのに問題があります。現在、OracleのSQLDeveloperツールを使用しています。
トリガーをテストするために、テストウィンドウに挿入または削除を書き込みますが、トリガー内で何が起こっているのかがわかりません。トリガーをステップスルーして、トリガーが起動したときに何が起こっているかを確認したいと思います。selectステートメントを使用してトリガー内の変数値を表示する方法はありますか?
Oracleでトリガーをデバッグするのに問題があります。現在、OracleのSQLDeveloperツールを使用しています。
トリガーをテストするために、テストウィンドウに挿入または削除を書き込みますが、トリガー内で何が起こっているのかがわかりません。トリガーをステップスルーして、トリガーが起動したときに何が起こっているかを確認したいと思います。selectステートメントを使用してトリガー内の変数値を表示する方法はありますか?
まず、「ここから開始」しないでください。具体的には、トリガーを使用しないでください。トリガーが各行に対して起動する場合、トリガーは行レベルの処理への切り替えを強制します。呼び出すストアドプロシージャにロジックを配置することをお勧めします。次に、開始(入力を検証する場所)と終了、およびロジックパスがあります。ストアドプロシージャは、1つのパスをたどると、デバッグがはるかに簡単になります。
次に、処理方法がわからないエラーをテストしないでください。あなたがそれを捕まえない場合、それは何がうまくいかなかったのか(エラーメッセージ)そしてどこで(すなわちエラー/コールスタック)を示すエラーレポートを受け取るクライアントに泡立ちます。あなたがそれを捕まえようとするなら、あなたはそれをどうするかを知らなければなりません(そしてあなたがそれを無視する傾向がわからないなら-それは悪いことです)。
最後に、選択の各「レイヤー」を簡単に確認することはできません。説明計画は、一般的に、それがどのように物事を進めているかを教えてくれます。v $ session_longopsは、現在何をしているかを示す場合があります。現在の待機イベントは、現在作業しているテーブル/ブロック/行に関する手がかりを与える場合があります。
トリガーをデバッグする必要がある場合の大まかな簡単な方法は、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
アプリケーション私は、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;