2016-09-22 6 views
2

Мне нужно обновить таблицу из другой таблицы.Добавить еще одно обновление для Merge Into PL SQL trigger

Вот таблица 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 

Я попытался Loop и если, но до сих пор не может получить 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

ой спасибо много сэра. это действительно полезно. –

Смежные вопросы