Idealnie sugerowałbym użycie rejestrowania błędów DML. Na przykład
Utwórz tabelę dziennika błędów
begin
dbms_errlog.create_error_log( dml_table_name => 'EMPLOYEE',
err_log_table_name => 'EMPLOYEE_ERR' );
end;
Użyj rejestrowania błędów 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;
Dla każdego wiersza, który się nie powiedzie, dane tego wiersza zostaną zarejestrowane w EMPLOYEE_ERR
tabela wraz z wyjątkiem. Następnie możesz wysłać zapytanie do tabeli dziennika błędów, aby zobaczyć wszystkie błędy, zamiast otrzymywać tylko pierwszy wiersz, który się nie powiódł.
Jeśli tworzenie tabeli dziennika błędów nie jest opcją, możesz przejść z SQL do PL/SQL za pomocą operacji zbiorczych. To będzie wolniejsze, ale możesz użyć SAVE EXCEPTIONS
klauzula FORALL
instrukcja, aby utworzyć zagnieżdżoną tabelę wyjątków, którą można następnie powtarzać.