2016-05-22 30 views
3

我試圖創建SQL Developer的一個簡單的Trigger顯示在工資的變化,當它改變時SQL觸發器顯示工資變化

CREATE OR REPLACE TRIGGER salary_changes 
BEFORE DELETE OR INSERT OR UPDATE ON FACULTY 
FOR EACH ROW 

DECLARE 
    sal_diff NUMBER; 

BEGIN 
    sal_diff := :NEW.F_SALARY - :OLD.F_SALARY; 

    DBMS_OUTPUT.PUT_LINE('Difference: ' || sal_diff); 
END; 

當我嘗試運行它提示要輸入綁定觸發對於NEW和OLD,當我嘗試運行更新以查看它是否有效時,說明觸發器失敗。那麼我如何錯誤地使用舊標籤和新標籤呢?或者是不是問題

回答

0

您的代碼有幾個問題。

  1. 您需要創建after trigger而不是before trigger。

  2. 您正試圖編寫一個執行 插入,刪除或更新操作的觸發器。因此,您應該執行條件檢查 (如插入,刪除或更新)子句。

  3. 此外,當您刪除時,沒有新的值,但只是舊的 值。

我會改變你的觸發如下..

CREATE OR REPLACE TRIGGER salary_changes 
AFTER DELETE OR INSERT OR UPDATE ON FACULTY 
FOR EACH ROW 

DECLARE 
    sal_diff NUMBER; 
BEGIN 
If (INSERTING or UPDATING) then 
    sal_diff := :NEW.F_SALARY - :OLD.F_SALARY; 
    DBMS_OUTPUT.PUT_LINE('Difference: ' || sal_diff); 
    END IF; 

IF DELETING THEN 
    DBMS_OUTPUT.PUT_LINE('The deleted value is:' || :OLD.F_SALARY); 
END IF; 
END; 
+0

我想實現它就像你說的。它運行成功,但當我更新數據時,沒有任何與觸發相關的信息。它只是表示「5行更新」。並沒有任何關於任何觸發器 – user3441417

+0

我沒有在dbms輸出中添加連接,所以我看不到它謝謝 – user3441417