sql >> Base de Datos >  >> RDS >> Oracle

Capture valores que activan DUP_VAL_ON_INDEX

Idealmente, sugeriría usar el registro de errores DML. Por ejemplo

Crear la tabla de registro de errores

begin
  dbms_errlog.create_error_log( dml_table_name => 'EMPLOYEE',
                                err_log_table_name => 'EMPLOYEE_ERR' );
end;

Usar el registro de errores 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;

Por cada fila que falle, esto registrará los datos de la fila en el EMPLOYEE_ERR tabla junto con la excepción. Luego puede consultar la tabla de registro de errores para ver todos los errores en lugar de obtener solo la primera fila que falló.

Si crear la tabla de registro de errores no es una opción, puede pasar de SQL a PL/SQL con operaciones masivas. Eso será más lento, pero podría usar SAVE EXCEPTIONS cláusula del FORALL declaración para crear una tabla anidada de excepciones que luego podría iterar.