为 Merge Into PL SQL 触发器添加另一个更新

Add another Update for Merge Into PL SQL trigger

我必须从另一个 table 中插入 table。

这里是tableMST_LIST

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

和TMP_LIST更新之前的table

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

并且我使用合并来更新插入。这是我创建的代码。

  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 和 If,但仍然无法得到预期的结果。请帮我。谢谢。

您需要在触发器中编写一个自治事务来实现此目的。见下文:

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;