※REFERENCING
預設的:new和:old可以改成自己喜歡的,可以只改一個CREATE OR REPLACE TRIGGER line_trig_update BEFORE UPDATE OF SAL ON EMP REFERENCING new AS ooo old AS xxx FOR EACH ROW DECLARE BEGIN IF ABS(:ooo.sal - :xxx.sal) >= 1000 THEN RAISE_APPLICATION_ERROR(-20000, '加薪太過!'); END IF; END;
※如上new改成ooo;old改成xxx,所以new和old就不能用了,AS可省略
※WHEN
trigger被觸發之後會判斷這裡設定的條件CREATE OR REPLACE TRIGGER line_trig_update BEFORE UPDATE OF SAL ON EMP FOR EACH ROW WHEN (new.sal <= old.sal) BEGIN RAISE_APPLICATION_ERROR(-20000, '新的薪水<=舊的薪水'); END;
※要注意使用WHEN時,new和old,不能加前面的「:」
※增刪改ING
Oracle提供三個內鍵的變數,可以判斷增刪改,分別是INSERTING、UPDATING、DELETINGCREATE OR REPLACE TRIGGER line_trig_update BEFORE INSERT OR UPDATE OR DELETE ON DEPT -- FOR EACH ROW BEGIN IF INSERTING THEN RAISE_APPLICATION_ERROR(-20000, '新增'); ELSIF UPDATING THEN RAISE_APPLICATION_ERROR(-20001, '修改'); ELSIF DELETING THEN RAISE_APPLICATION_ERROR(-20002, '刪除'); END IF; END;
※行、表級都可以用,BEFORE後面的INSERT等還是要寫
※FOLLOWS
多個觸發器的條件都一樣時,順序不一定會按照我們想的去做,所以可以用FOLLOWSCREATE OR REPLACE TRIGGER dept1 BEFORE INSERT ON DEPT FOR EACH ROW BEGIN DBMS_OUTPUT.PUT_LINE('111'); END; CREATE OR REPLACE TRIGGER dept2 BEFORE INSERT ON DEPT FOR EACH ROW -- FOLLOWS dept1 BEGIN DBMS_OUTPUT.PUT_LINE('222'); END; CREATE OR REPLACE TRIGGER dept3 BEFORE INSERT ON DEPT FOR EACH ROW -- FOLLOWS dept2 BEGIN DBMS_OUTPUT.PUT_LINE('333'); END;
※如上有三個觸發器,我新增時的順序是321,但我想要123,所以將上面的註解打開即可
※FOLLOWS後面接trigger名稱,後面接的trigger觸發完後就會換自己了
※如果2和3都接1不會錯,只是就和沒設定FOLLOWS一樣,順序不確定,沒意義了
沒有留言:
張貼留言