2016年2月24日 星期三

Trigger二(DML trigger二 REFERENCING、WHEN、增刪改ING、FOLLOWS) (PL/SQL 十九)

※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、DELETING
CREATE 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

多個觸發器的條件都一樣時,順序不一定會按照我們想的去做,所以可以用FOLLOWS
CREATE 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一樣,順序不確定,沒意義了

沒有留言:

張貼留言