sql >> Base de Datos >  >> RDS >> Oracle

Continuar MERGE después de EXCEPTION

Puede hacer esto con la error_logging_clause . (El enlace es para insertar porque en la documentación de COMBINAR dice que tiene el mismo comportamiento que una inserción.

Para su caso:

-- 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;

Tenga en cuenta que existen algunas limitaciones para error_logging_clause. De la documentación:

  1. Las siguientes condiciones hacen que la declaración falle y retroceda sin invocar la capacidad de registro de errores:

    • Restricciones diferidas violadas.

    • Cualquier operación INSERT o MERGE de ruta directa que genere una restricción única o una infracción de índice.

    • Cualquier operación de actualización UPDATE o MERGE que genere una restricción única o una infracción de índice).

  2. No puede realizar un seguimiento de los errores en la tabla de registro de errores para las columnas LONG, LOB o de tipo de objeto. Sin embargo, la tabla que es el destino de la operación DML puede contener este tipo de columnas.

    • Si crea o modifica la tabla de registro de errores correspondiente para que contenga una columna de un tipo no admitido, y si el nombre de esa columna corresponde a una columna no admitida en la tabla DML de destino, entonces la instrucción DML falla en el momento del análisis.

    • Si la tabla de registro de errores no contiene ningún tipo de columna no compatible, todos los errores DML se registran hasta que se alcanza el límite de rechazo de errores. Para las filas en las que se producen errores, los valores de columna con las columnas correspondientes en la tabla de registro de errores se registran junto con la información de control.