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.