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.