Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Continuar MERGE após EXCEPTION


Você pode fazer isso com a error_logging_clause . (O link é para a inserção porque na documentação de MERGURAR diz que tem o mesmo comportamento de um insert.

Para o seu 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;

Observe que existem algumas limitações para o error_logging_clause. Da documentação:

  1. As condições a seguir fazem com que a instrução falhe e seja revertida sem invocar o recurso de log de erros:

    • Restrições diferidas violadas.

    • Qualquer operação INSERT ou MERGE de caminho direto que gera uma restrição exclusiva ou violação de índice.

    • Qualquer operação de atualização UPDATE ou MERGE que gera uma violação de índice de restrição exclusiva).

  2. Você não pode rastrear erros na tabela de log de erros para colunas de tipo LONG, LOB ou objeto. No entanto, a tabela que é o destino da operação DML pode conter esses tipos de colunas.

    • Se você criar ou modificar a tabela de log de erros correspondente para que ela contenha uma coluna de um tipo não suportado e se o nome dessa coluna corresponder a uma coluna não suportada na tabela DML de destino, a instrução DML falhará no momento da análise.

    • Se a tabela de log de erros não contiver nenhum tipo de coluna sem suporte, todos os erros DML serão registrados até que o limite de rejeição de erros seja atingido. Para as linhas nas quais ocorrem erros, os valores das colunas com colunas correspondentes na tabela de log de erros são registrados juntamente com as informações de controle.