Oracle
 sql >> Base de données >  >> RDS >> Oracle

Continuer MERGE après EXCEPTION

Vous pouvez le faire avec la error_logging_clause . (Le lien est pour l'insert car dans la documentation de FUSIONNER il dit qu'il a le même comportement qu'un insert.

Pour votre cas :

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

Veuillez noter qu'il existe certaines limitations pour la clause error_logging_clause. De la documentation :

  1. Les conditions suivantes entraînent l'échec et l'annulation de l'instruction sans appeler la fonctionnalité de journalisation des erreurs :

    • Contraintes différées violées.

    • Toute opération INSERT ou MERGE de chemin direct qui soulève une contrainte unique ou une violation d'index.

    • Toute opération de mise à jour UPDATE ou MERGE qui déclenche une contrainte unique ou une violation d'index).

  2. Vous ne pouvez pas suivre les erreurs dans la table de journalisation des erreurs pour les colonnes de type LONG, LOB ou objet. Cependant, la table cible de l'opération DML peut contenir ces types de colonnes.

    • Si vous créez ou modifiez la table de journalisation des erreurs correspondante afin qu'elle contienne une colonne d'un type non pris en charge, et si le nom de cette colonne correspond à une colonne non prise en charge dans la table DML cible, l'instruction DML échoue au moment de l'analyse.

    • Si la table de consignation des erreurs ne contient aucun type de colonne non pris en charge, toutes les erreurs DML sont consignées jusqu'à ce que la limite de rejet des erreurs soit atteinte. Pour les lignes sur lesquelles des erreurs se produisent, les valeurs de colonne avec les colonnes correspondantes dans le tableau de journalisation des erreurs sont consignées avec les informations de contrôle.