【问题标题】:MERGE - When not matched INSERT's exceptionMERGE - 当不匹配时 INSERT 的异常
【发布时间】:2011-04-05 17:01:08
【问题描述】:

我有一个使用 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: unique constrain error

我想要做的是将重复的列发送到另一个表 my_Table_recyledbin 以获得成功的 INSERT,我可以使用 EXCEPTION WHEN DUP_VAL_ON_INDEX 吗?如果是,如何将它与 MERGE 语句一起使用?

提前致谢

【问题讨论】:

    标签: sql oracle merge ora-00001


    【解决方案1】:

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

    首先,进行合并(聚合重复的行以避免唯一约束错误)。我在 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)
    

    希望这能满足您的需求。

    【讨论】:

    • 谢谢汤姆,这真的很有帮助,我马上试试!
    【解决方案2】:

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

    LOG ERRORS INTO my_Table_recycledbin
    

    【讨论】:

    • 谢谢你,戴夫,我不知道日志错误,我正在阅读它,不幸的是它说:> DML 错误日志记录功能在以下情况下不被调用: - UPDATE 或 MERGE 操作引发唯一约束或索引违规
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多