Helst skulle jag föreslå att du använder DML-felloggning. Till exempel
Skapa felloggtabellen
begin
dbms_errlog.create_error_log( dml_table_name => 'EMPLOYEE',
err_log_table_name => 'EMPLOYEE_ERR' );
end;
Använd DML-felloggning
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;
För varje rad som misslyckas kommer detta att logga data för raden i EMPLOYEE_ERR
tabell tillsammans med undantaget. Du kan sedan fråga felloggtabellen för att se alla fel istället för att bara få den första raden som misslyckades.
Om att skapa felloggtabellen inte är ett alternativ kan du flytta från SQL till PL/SQL med bulkoperationer. Det kommer att gå långsammare men du kan använda SAVE EXCEPTIONS
satsen i FORALL
för att skapa en kapslad tabell med undantag som du sedan kan iterera över.