もうすぐです。何かを宣言したい場合は、トリガーにDECLAREブロックが必要です。これは、WHEN句が間違った場所にあることを意味します。
create or replace trigger trig1
before update
of sal
on emp
for each row
when (new.sal < old.sal)
declare
user_xcep EXCEPTION;
PRAGMA EXCEPTION_INIT( user_xcep, -20001 );
begin
raise user_xcep;
end;
SQLフィドル
いくつかのポイント:
- 決して 例外をキャッチしてから、DBMS_OUTPUT.PUT_LINEを呼び出します。それは無意味です。すべてのレコードの結果を表示するには、誰かがそこにいる必要があります。何かが発生したくない場合は、例外を発生させてからキャッチします。例外にエラーコードを追加して、トリガーの外でこれをキャッチし、希望どおりに処理できるようにしました(stdoutに何も出力しないでください)。
- これはマイナーなポイントですが、少し空白を追加しました。あまりない。コードがなかったため、最初はコードのどこに問題があるのかわかりませんでした。
- 例外宣言とRAISEの後、セミコロンがありませんでした。
ドキュメントで内部的に定義された例外の詳細を読む