为 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;
我必须从另一个 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;