2017-04-19 12 views
0

ユーザーが挿入しているプレート番号が既に存在するかどうかを確認するためにトリガーを使用しようとしています。いくつかのエラーがありましたが、解決できません。以下はスクリプトですトリガーを使用してデータが既に表に存在していて、挿入をブロックしている場合

CREATE OR REPLACE TRIGGER trig_check_plate_no 
BEFORE INSERT OR UPDATE OF plate_number ON cars 
FOR EACH ROW 
WHEN(NEW.plate_number IS NOT NULL) 

DECLARE 
vn_count NUMBER(10); 

BEGIN 
    SELECT COUNT(*) 
    INTO vn_count 
    FROM cars 
    WHERE plate_number = NEW.plate_number 
    IF(:vn_count>0) 
     THEN DBMS_OUTPUT.PUT_LINE('Insertion blocked.'); 
     ELSE DBMS_OUTPUT.PUT_LINE('Data inserted.'); 
    END IF; 
END trig_check_plate_no; 
/

どうすれば解決できますか?

+0

DBMS_OUTPUT.PUT_LINEはOracleです。この質問には正しくタグ付けされていますか? –

+3

一意のインデックスを作成します。 –

+2

ユニークなインデックスまたは(より良い)ユニークな制約を作成します。しかし、あなたの引き金に(主な)問題に答えるためには、コロンを後方に持っていなければなりません。 「NEW」が出現するたびにコロン(:)が必要です。そして、あなたは "vn_count"の前に一つも持ってはいけません。 –

答えて

0

実際には、無効な値を意図的に提供する以外に、実行をトリガした操作をトリガーで強制終了することはできません。あなたは既に存在する値を挿入しようとすると、あなたのDBMSがエラーをスローする必要があり

ALTER TABLE cars ADD CONSTRAINT c_plate_no UNIQUE (plate_number); 

:あなたが何をしたいか

を達成するために、最も簡単な方法は、そのテーブルの一意のインデックスを作成することです。

このようにすると、トリガーを完全に省略することができます。

+0

私のコードでは、NEW.plate_numberにエラーが表示されています。どのようにそれを解決するには? 「NEW.plate_number識別子を宣言する必要があります」と言っています。 –

+0

質問にはタグが付いていたので、私の答えはmysqlに関連していましたが、Oracleではユニークな制約が働くはずです。 – Psi

+0

'NEW.plate_number'は構文的にトリガーに関連しています。ユニーク制約(=ユニークインデックス)を使用する場合、トリガーはまったく必要ありません。 – Psi

関連する問題