1

私は Oracle のトリガーを初めて使用します。次の構文で EVENT テーブルを作成しました。

CREATE TABLE Event
(event_id NUMBER (3) NOT NULL,
 event_date DATE NOT NULL,
 venue_id NUMBER (2) NOT NULL,
 concert_id NUMBER (3) NOT NULL
);

8 月中にコンサートを実行できないようにするトリガーを作成したいと考えています。トリガーを作成するために次のコードを試しました。トリガーは正常に作成されましたが、8 月の日付を挿入した後、挿入されました。これは想定されていません。

CREATE OR REPLACE TRIGGER check_date
  BEFORE INSERT ON event
DECLARE 
  event_date date;
BEGIN
  IF (to_char(event_date, 'mm') = 8) THEN
    raise_application_error(-20000, 'Concerts cannot be run during August');
  END IF;
END;
4

2 に答える 2

5

まず、トリガーはステートメント レベルのトリガーではなく、行レベルのトリガーである必要があります。すべてのステートメントに対して 1 回だけではなく、挿入されるすべての行に対してトリガーを起動する必要があります。トリガーを行レベル トリガーとして宣言すると、挿入される各行のデータを表示できます。

次に、ローカル変数を宣言したくありませんevent_date。挿入されている行:new.event_dateの がどれであるかを調べたいとします。event_date

この二つを合わせると

CREATE OR REPLACE TRIGGER check_date
  BEFORE INSERT ON event
  FOR EACH ROW
BEGIN
  IF (to_char(:new.event_date, 'mm') = 8) THEN
    raise_application_error(-20000, 'Concerts cannot be run during August');
  END IF;
END;

その後、必要な動作が得られます

SQL> insert into event values( 1, date '2012-08-01', 1, 1 );
insert into event values( 1, date '2012-08-01', 1, 1 )
            *
ERROR at line 1:
ORA-20000: Concerts cannot be run during August
ORA-06512: at "SCOTT.CHECK_DATE", line 3
ORA-04088: error during execution of trigger 'SCOTT.CHECK_DATE'

清潔さの一般的な問題として、文字列と文字列、および数値と数値も比較する必要があります。だからあなたはどちらかが欲しいでしょう

to_number( to_char(:new.event_date, 'mm') ) = 8

また

to_char(:new.event_date, 'fmmm') = '8'

また

to_char(:new.event_date, 'mm') = '08'
于 2012-08-18T01:59:43.473 に答える