Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Capturar valores que acionam DUP_VAL_ON_INDEX


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.