В идеалния случай бих предложил да използвате регистриране на грешки в DML. Например
Създайте таблица с регистър на грешки
begin
dbms_errlog.create_error_log( dml_table_name => 'EMPLOYEE',
err_log_table_name => 'EMPLOYEE_ERR' );
end;
Използване на регистриране на грешки в 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;
За всеки ред, който е неуспешен, това ще регистрира данните за реда в EMPLOYEE_ERR
таблица заедно с изключение. След това можете да направите заявка в таблицата с регистър на грешките, за да видите всички грешки, вместо да получите само първия ред, който е неуспешен.
Ако създаването на таблицата с регистър на грешките не е опция, можете да преминете от SQL към PL/SQL с групови операции. Това ще бъде по-бавно, но можете да използвате SAVE EXCEPTIONS
клауза на FORALL
израз, за да създадете вложена таблица с изключения, която след това можете да повторите.