2012-12-16 132 views
1

我是PLSQL的新手,我想創建一個觸發器,在進行更新之前先檢查表中是否有記錄。 我到目前爲止的代碼是:更新值的觸發器

CREATE OR REPLACE TRIGGER table_bu 
BEFORE UPDATE ON employee 
FOR EACH ROW 
DECLARE 
    v_employee_id:=employee.employee_ID%TYPE; 
BEGIN 
    SELECT employee_id INTO v_employee_id FROM employee; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     RAISE_APPLICATION_ERROR (-20001,'data not found'); 
END; 

如何創建,檢查了,如果在表中存在的記錄的觸發,如果它不存在,不允許更新。 我的表estructure是:

employee_id NUMBER 
employee_name VARCHAR(20) 
employee_salary NUMBER 
... 

感謝

+0

是否http://stackoverflow.com/questions/8770386/幫助? –

回答

2

你是一個錯誤的方式。即使在修復語法錯誤之後,觸發器仍會拋出運行時「突變表」錯誤 - 您在raise_application_error之後錯過了分號(也應該接受2個參數,而不是一個)。正確的語法:

EXCEPTION 
WHEN NO_DATA_FOUND THEN 
    RAISE_APPLICATION_ERROR (-20001, 'data not found'); -- 1st parameter -error code 

更新

據我瞭解問題的更新版本,你想顯示錯誤,如果記錄不存在。行級觸發方法的問題在於,如果由於WHERE中的條件而未找到任何內容,它將不會被執行。最簡單的方法是檢查客戶端受影響的行數,並在那裏引發錯誤。或者你可以編寫執行所需更新後檢查sql%rowcount一個過程,然後拋出一個異常,如果是0
如果你喜歡在硬辦法的事,你可以創建包變量,employee.employee_ID%TYPE型的,之前更新語句級觸發器在更新行級別觸發器(將該變量設置爲NEW.employee_ID)之後,以及在更新語句級別觸發器(如果該變量爲null時拋出異常)之後重置變量(假設設置爲null)。注意:這僅適用於單個更新。

+0

@Manolo:你需要傳遞的錯誤代碼,以及爲''RAISE_APPLICATION_ERROR – a1ex07

+0

@Manolo:我不是100%確定要實現...如果行級觸發器觸發,記錄在表中存在的東西 - 你的檢查沒有多大意義。也許你想檢查其他表中的某些記錄的存在? – a1ex07

+0

嗨@ a1ex07我想,如果例如我把更新員工設置工資= 2000其中emp_id = 100,並且代碼100不存在,那麼它顯示錯誤消息 – Layla

0

「我怎樣才能創建檢查了,如果在表中存在的記錄和觸發,如果它不存在不允許的更新。」

實在是隻有一個實際的方式做到這一點 - 使用引用約束(外鍵)。