异常后继续合并

2023-12-06

是否可以继续MERGEEXCEPTION ?

MERGE INTO copy_emp c
     USING employees e
     ON (c.employee_id = e.employee_id)
   WHEN MATCHED THEN
     UPDATE SET
       c.first_name     = e.first_name,
       c.last_name      = e.last_name,
       c.email          = e.email,
       c.phone_number   = e.phone_number,
       c.hire_date      = e.hire_date,
       c.job_id         = e.job_id,
       c.salary         = e.salary,
       c.commission_pct = e.commission_pct,
       c.manager_id     = e.manager_id,
       c.department_id  = e.department_id
   WHEN NOT MATCHED THEN
     INSERT VALUES(e.employee_id, e.first_name, e.last_name,
          e.email, e.phone_number, e.hire_date, e.job_id,
          e.salary, e.commission_pct, e.manager_id,
          e.department_id);

EXCEPTION
    WHEN OTHERS THEN
        -- ?????

除了检索引发异常的行的 ID 并重新启动MERGE忽略这个 ID 我不知道该怎么做。

我正在使用 Oracle 数据库 10。


您可以使用错误记录子句。 (该链接用于插入,因为在文档中MERGE它说它具有与插入相同的行为。

对于你的情况:

-- You create your Log Table
EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('copy_emp', 'TAB_ERR_COPY_EMP');


    MERGE INTO copy_emp c
     USING employees e
     ON (c.employee_id = e.employee_id)
   WHEN MATCHED THEN
     UPDATE SET
       c.first_name     = e.first_name,
       c.last_name      = e.last_name,
       c.email          = e.email,
       c.phone_number   = e.phone_number,
       c.hire_date      = e.hire_date,
       c.job_id         = e.job_id,
       c.salary         = e.salary,
       c.commission_pct = e.commission_pct,
       c.manager_id     = e.manager_id,
       c.department_id  = e.department_id
   WHEN NOT MATCHED THEN
     INSERT VALUES(e.employee_id, e.first_name, e.last_name,
          e.email, e.phone_number, e.hire_date, e.job_id,
          e.salary, e.commission_pct, e.manager_id,
          e.department_id)
    LOG ERRORS INTO TAB_ERR_COPY_EMP('TAG_STATEMENT') REJECT LIMIT 100;

请注意,error_logging_clause 有一些限制。从文档中:

  1. 以下情况会导致语句失败并回滚 不调用错误记录功能:

    • 违反了延迟约束。

    • 任何产生唯一的直接路径 INSERT 或 MERGE 操作 约束或索引违规。

    • 任何引发唯一约束的更新操作 UPDATE 或 MERGE 或索引违规)。

  2. 您无法在错误记录表中跟踪 LONG、LOB 或 对象类型列。但是,作为目标的表 DML 操作可以包含这些类型的列。

    • 如果您创建或修改相应的错误日志表以便 它包含一个不支持类型的列,并且如果该列的名称 列对应于目标 DML 表中不受支持的列, 那么 DML 语句在解析时失败。

    • 如果错误日志记录表不包含任何不支持的列 类型,然后记录所有 DML 错误,直到拒绝限制 已达到错误。对于发生错误的行,列值 错误日志表中的相应列会一起记录 与控制信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异常后继续合并 的相关文章

随机推荐