V ideálním případě bych doporučil používat protokolování chyb DML. Například
Vytvořte tabulku protokolu chyb
begin
dbms_errlog.create_error_log( dml_table_name => 'EMPLOYEE',
err_log_table_name => 'EMPLOYEE_ERR' );
end;
Použít protokolování chyb 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;
Pro každý řádek, který selže, se data pro daný řádek zaznamenají do EMPLOYEE_ERR
tabulky spolu s výjimkou. Poté můžete dotaz na tabulku chybových protokolů zobrazit všechny chyby, nikoli získat pouze první řádek, který selhal.
Pokud vytvoření tabulky chybových protokolů není možné, můžete přejít z SQL na PL/SQL pomocí hromadných operací. Bude to pomalejší, ale můžete použít SAVE EXCEPTIONS
klauzule FORALL
příkaz k vytvoření vnořené tabulky výjimek, kterou pak můžete iterovat.