Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Erfassen Sie Werte, die DUP_VAL_ON_INDEX auslösen

Idealerweise würde ich vorschlagen, die DML-Fehlerprotokollierung zu verwenden. Zum Beispiel

Erstellen Sie die Fehlerprotokolltabelle

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

DML-Fehlerprotokollierung verwenden

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;

Für jede fehlgeschlagene Zeile werden die Daten für die Zeile in EMPLOYEE_ERR protokolliert Tabelle zusammen mit der Ausnahme. Sie können dann die Fehlerprotokolltabelle abfragen, um alle Fehler anzuzeigen, anstatt nur die erste fehlerhafte Zeile zu erhalten.

Wenn das Erstellen der Fehlerprotokolltabelle keine Option ist, können Sie mit Massenoperationen von SQL zu PL/SQL wechseln. Das wird langsamer sein, aber Sie könnten die SAVE EXCEPTIONS verwenden -Klausel des FORALL -Anweisung, um eine verschachtelte Tabelle mit Ausnahmen zu erstellen, über die Sie dann iterieren können.