Sql 异常后继续合并

Sql 异常后继续合并,sql,oracle,exception,plsql,merge,Sql,Oracle,Exception,Plsql,Merge,在异常之后是否可以继续合并 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,

异常
之后是否可以继续
合并

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,然后重新启动
合并
,忽略此ID,我不知道该怎么做


我正在使用Oracle数据库10。

有几种方法可以避免终止。我主要使用
来保存所有异常
子句

在OracleDatabase10g及更高版本中,PL/SQL提供了三种“继续通过异常”的选项,这实际上意味着避免终止当前块的执行。请阅读Steven Feuerstein的这篇优秀文章,

您可以使用。(该链接是用于插入的,因为在它的文档中说它与插入具有相同的行为

对于您的情况:

-- 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_子句有一些限制。从文档中可以看出:

  • 下列情况导致语句失败并回滚 在不调用错误日志功能的情况下:

    • 违反了延迟约束

    • 引发唯一路径的任何直接路径插入或合并操作 约束或索引冲突

    • 引发唯一约束的任何更新操作更新或合并 或索引冲突)

  • 无法在错误日志记录表中跟踪长时间、LOB或 对象类型列。但是,作为目标的表 DML操作可以包含这些类型的列

    • 如果创建或修改相应的错误日志记录表,则 它包含一个不受支持类型的列,如果 列对应于目标DML表中不受支持的列, 然后,DML语句在解析时失败

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


  • 是否可以先调用没有必须手动修复的主要错误的结果集,然后将其用于此查询?否则,您将不得不做一些事情,比如在缺失或不正确的值中插入默认值,这是您绝对不想做的事情,因为人们最终可能会进入他们不在的部门或职位。@user3427079,您将如何使用运行复杂ETL批处理的大型、更大、更大的应用程序来扩展它?您是否可以手动修复每个错误,然后继续?这里不是讨论这些问题的地方,但当涉及到跟踪您花钱让谁做什么时,我会首先运行所有正确和可接受的数据,然后开始检查那些明显错误的数据,这是一种危险的方式。比如因为打字错误付给你的看门人一万。