2017-04-19 68 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

實際上,您不能強制觸發器中止觸發其執行的操作,而是提供無效的值,這不是一個好的樣式。

達到你想要做什麼,最簡單的方法是在該表上創建唯一索引:當您嘗試插入已經存在的價值

ALTER TABLE cars ADD CONSTRAINT c_plate_no UNIQUE (plate_number); 

你的DBMS應該拋出一個錯誤。

這樣做後,你可以完全省略你的觸發器。

+0

在我的代碼中,NEW.plate_number中顯示錯誤。如何解決它?它的俗語「標識符NEW.plate_number必須聲明」。 –

+0

我的答案與mysql有關,因爲問題被標記爲這樣,但是,唯一的約束也應該在oracle中工作。 – Psi

+0

'NEW.plate_number'在句法上與觸發器相關。使用唯一約束(=唯一索引)時根本不需要觸發器。 – Psi

相關問題