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

Capturer les valeurs qui déclenchent DUP_VAL_ON_INDEX

Idéalement, je suggérerais d'utiliser la journalisation des erreurs DML. Par exemple

Créer le tableau du journal des erreurs

begin
  dbms_errlog.create_error_log( dml_table_name => 'EMPLOYEE',
                                err_log_table_name => 'EMPLOYEE_ERR' );
end;

Utiliser la journalisation des erreurs DML

BEGIN
  insert into employee( id )
    select id 
      from (select '01' id from dual
            union all
            select '02' from dual) 
    log errors into employee_err
        reject limit unlimited;
END;

Pour chaque ligne qui échoue, cela enregistrera les données de la ligne dans le EMPLOYEE_ERR table avec l'exception. Vous pouvez ensuite interroger la table du journal des erreurs pour voir toutes les erreurs plutôt que d'obtenir uniquement la première ligne qui a échoué.

Si la création de la table du journal des erreurs n'est pas une option, vous pouvez passer de SQL à PL/SQL avec des opérations en masse. Ce sera plus lent mais vous pouvez utiliser le SAVE EXCEPTIONS clause du FORALL pour créer une table imbriquée d'exceptions sur laquelle vous pouvez ensuite parcourir.