我有一个使用MERGE的PL / SQL程序:
MERGE INTO
table_dest d
USING
(SELECT * FROM my_Table) s
ON
(s.id = d.id)
when matched then UPDATE set d.col1 = s.col1
when not matched then INSERT (id, col1) values (s.id, s.col1);
现在假设查询s
返回具有相同ID的多行,将返回 ORA-00001:唯一约束错误
我想要做的是将重复的列发送到另一个表 my_Table_recyledbin 以获得成功的INSERT,我可以使用EXCEPTION WHEN DUP_VAL_ON_INDEX
吗?如果是,如何将其与MERGE语句一起使用?
提前致谢
答案 0 :(得分:4)
为什么不在单独的语句中处理将重复行存档到回收站表?
首先,进行合并(聚合重复行以避免唯一约束错误)。我在col1上假设了一个MAX
聚合函数,但你可以使用任何适合你需要的函数 - 你没有指定如何在有重复时决定使用哪一行。
MERGE INTO
table_dest d
USING
(SELECT a.id, MAX(a.col1) as col1
FROM my_Table a
GROUP BY a.id) s
ON
(s.id = d.id)
WHEN MATCHED THEN UPDATE SET d.col1 = s.col1
WHEN NOT MATCHED THEN INSERT (id, col1) VALUES (s.id, s.col1);
然后,处理重复的行。我假设您的回收站表确实允许插入重复的ID:
INSERT INTO my_Table_recyledbin r (id, col1)
SELECT s.id, s.col1
FROM my_Table s
WHERE EXISTS (SELECT 1
FROM my_Table t
WHERE t.id = s.id
AND t.ROWID != s.ROWID)
希望这能满足您的需求。
答案 1 :(得分:2)
你不能只使用错误记录条款吗? I.E.,在MERGE语句末尾添加以下行:
LOG ERRORS INTO my_Table_recycledbin