Idealmente, eu sugeriria usar o log de erros DML. Por exemplo
Criar a tabela de log de erros
begin
dbms_errlog.create_error_log( dml_table_name => 'EMPLOYEE',
err_log_table_name => 'EMPLOYEE_ERR' );
end;
Usar registro de erros 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;
Para cada linha que falha, isso registrará os dados da linha no
EMPLOYEE_ERR
tabela junto com a exceção. Você pode consultar a tabela de log de erros para ver todos os erros em vez de obter apenas a primeira linha que falhou. Se a criação da tabela de log de erros não for uma opção, você poderá passar de SQL para PL/SQL com operações em massa. Isso será mais lento, mas você pode usar o
SAVE EXCEPTIONS
cláusula do FORALL
para criar uma tabela aninhada de exceções sobre a qual você pode iterar.