2016-09-22 63 views
2

我必須從另一個表中插入表。添加另一個更新合併到PL SQL觸發器

下面是表MST_LIST

NAME | VER | FLAG 
-----+-----+----- 
A |201 |1 
B |101 |1 

而且TMP_LIST更新上表

T_NAME | T_VER 
-------+------- 
A  |202 
C  |101 

我用合併來UPSERT。這是我創建的代碼。

create or replace TRIGGER MST_LIST_TRIG 
    AFTER INSERT OR UPDATE ON TMP_LIST 
    FOR EACH ROW 
    BEGIN 
    MERGE INTO MST_LIST USING DUAL ON (NAME = :NEW.T_NAME) 
    WHEN MATCHED THEN UPDATE SET 
     VER = :NEW.T_VER 
    WHEN NOT MATCHED THEN INSERT (NAME, VER, FLAG_ACTIVE) 
     VALUES (:NEW.T_NAME, :NEW.T_VER, 1); 
    END MST_LIST_TRIG; 

但問題是我需要添加其他更新

update MST_LIST set FLAG = 0 where NOT EXISTS 
(SELECT TMP_LIST.T_NAME FROM TMP_LIST WHERE MST_LIST.NAME = TMP_LIST.T_NAME); 

拿到導致這樣

NAME | VER | FLAG 
-----+-----+----- 
A |202 |1 
B |101 |0 
C |101 |1 

我試過循環和如果,但仍不能得到excpected結果。請幫幫我。謝謝。

回答

1

您需要在觸發器中編寫一個自主事務來實現此目的。請看下圖:

create or replace TRIGGER MST_LIST_TRIG 
    AFTER INSERT OR UPDATE ON TMP_LIST 
    FOR EACH ROW 
    BEGIN 
    MERGE INTO MST_LIST USING DUAL ON (NAME = :NEW.T_NAME) 
    WHEN MATCHED THEN UPDATE SET 
     VER = :NEW.T_VER 
    WHEN NOT MATCHED THEN INSERT (NAME, VER, FLAG_ACTIVE) 
     VALUES (:NEW.T_NAME, :NEW.T_VER, 1);   

    --Calling a autonomous proc here 
    proc_upd(); 
END MST_LIST_TRIG; 

自治事務:

create or replace procedure proc_upd 
as 
PRAGMA AUTONOMOUS_TRANSACTION; 
begin 

    UPDATE MST_LIST 
    SET FLAG = 0 
    WHERE NOT EXISTS 
      (SELECT TMP_LIST.T_NAME 
      FROM TMP_LIST 
      WHERE MST_LIST.NAME = TMP_LIST.T_NAME); 

    commit; 

END; 
+0

哦,非常感謝主席先生。它真的很有幫助。 –