4

次のような状況があります: Salary 列が元の値よりも小さい値で更新された場合、エラー メッセージを出力し、更新が行われないようにします。これは私がこれまでに書いたものです:

CREATE OR REPLACE TRIGGER TRIG1
BEFORE UPDATE OF SAL ON EMP
for each row
  USER_XCEP EXCEPTION
  WHEN (NEW.SAL<OLD.SAL)
BEGIN
  RAISE USER_XCEP

EXCEPTION
  WHEN USER_XCEP THEN
       DBMS_OUTPUT.PUT_LINE('UPDATION NOT ALLOWED - ILLEGAL VALUES');
END;

そして、エラーが発生します-トリガーの仕様が正しくありません

これを達成する他の方法はありますか?

4

1 に答える 1

12

もうすぐそこです。何かを宣言したい場合は、トリガーに 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 フィドル

いくつかのポイント:

  1. 例外をキャッチしてからDBMS_OUTPUT.PUT_LINEを呼び出してはいけません。それは無意味です。すべてのレコードの結果を表示するには、誰かがそこにいる必要があります。何かを起こさせたくない場合は、例外を発生させてからキャッチします。例外にエラー コードを追加したので、トリガーの外側でこれをキャッチして、希望どおりに処理できます (stdout には何も出力しないでください)。
  2. 些細な点ですが、少し空白を追加しました。あまりない。あなたがコードを持っていなかったため、最初はコードのどこに問題があるのか​​ わかりませんでした。
  3. 例外宣言と RAISE の後にセミコロンがありませんでした。

内部で定義された例外の詳細については、ドキュメントを参照してください

于 2013-09-08T10:04:13.387 に答える