【问题标题】:Add another Update for Merge Into PL SQL trigger为 Merge Into PL SQL 触发器添加另一个更新
【发布时间】:2017-01-30 15:44:41
【问题描述】:

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

这是 MST_LIST 表

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

和 TMP_LIST 更新以前的表

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

【问题讨论】:

    标签: oracle plsql merge triggers upsert


    【解决方案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;  
    

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      相关资源
      最近更新 更多