2016-09-22 5 views
2

私は別のテーブルからテーブルをupsertする必要があります。ここでMerge into PL SQLトリガーへの別の更新を追加してください

が前のテーブルを更新するために、テーブル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; 

しかし、問題は私がループしている場合を試してみましたが、それでもexcpected結果を得ることができません。この

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

ような結果を取得するために別の更新

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); 

を追加する必要があります。私を助けてください。ありがとう。

答えて

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

ああおかげでたくさんの先生を。その本当に役に立つ。 –

関連する問題