是否有可能继续进行MERGE后EXCEPTION?
MERGE
EXCEPTION
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。
您可以使用error_logging_clause进行此操作。(该链接用于插入内容,因为在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有一些限制。从文档中:
以下情况导致该语句失败并回滚而未调用错误记录功能:
违反了延迟约束。
任何引发唯一约束或索引冲突的直接路径INSERT或MERGE操作。
产生唯一约束或索引冲突的任何更新操作UPDATE或MERGE)。
您不能在错误记录表中为LONG,LOB或对象类型列跟踪错误。但是,作为DML操作目标的表可以包含这些类型的列。
如果创建或修改相应的错误日志记录表,使其包含不支持的类型的列,并且该列的名称与目标DML表中的不支持的列相对应,则DML语句在解析时失败。
如果错误日志表不包含任何不受支持的列类型,则将记录所有DML错误,直到达到错误的拒绝限制。对于发生错误的行,错误记录表中具有相应列的列值将与控制信息一起记录。