1

我有一个使用 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 语句一起使用?

提前致谢

4

2 回答 2

4

为什么不在单独的语句中处理将重复行归档到回收站表?

首先,进行合并(聚合重复的行以避免唯一约束错误)。我MAX在 col1 上假设了一个聚合函数,但您可以使用任何适合您需要的函数——您还没有指定如何决定在有重复项时使用哪一行。

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)

希望这应该满足您的需求。

于 2010-08-30T12:27:23.693 回答
2

你不能只使用错误记录子句吗?IE,在 MERGE 语句的末尾添加这一行:

LOG ERRORS INTO my_Table_recycledbin
于 2010-08-30T13:36:16.483 回答