Dies kann mit Hilfe der DML-Fehlerprotokollierung erfolgen, wenn Sie mit 10gR2 oder höher arbeiten.
Ein Beispiel:
SQL> create table my_table (my_column)
2 as
3 select level from dual connect by level <= 9
4 /
Tabel is aangemaakt.
SQL> create function do_something
2 ( p_my_column in my_table.my_column%type
3 ) return my_table.my_column%type
4 is
5 begin
6 return 10 + p_my_column;
7 end;
8 /
Functie is aangemaakt.
SQL> alter table my_table add check (my_column not in (12,14))
2 /
Tabel is gewijzigd.
SQL> exec dbms_errlog.create_error_log('my_table')
PL/SQL-procedure is geslaagd.
Dadurch wird eine Fehlerprotokolltabelle namens err$_my_table . Diese Tabelle wird gefüllt, indem Sie Ihrer Aktualisierungsanweisung eine Fehlerprotokollklausel hinzufügen:
SQL> begin
2 update my_table
3 set my_column = do_something(my_column)
4 where my_column is not null
5 log errors reject limit unlimited
6 ;
7 end;
8 /
PL/SQL-procedure is geslaagd.
SQL> select * from err$_my_table
2 /
ORA_ERR_NUMBER$
--------------------------------------
ORA_ERR_MESG$
--------------------------------------------------------------------
ORA_ERR_ROWID$
--------------------------------------------------------------------
OR
--
ORA_ERR_TAG$
--------------------------------------------------------------------
MY_COLUMN
--------------------------------------------------------------------
2290
ORA-02290: check constraint (RWK.SYS_C00110133) violated
AAGY/aAAQAABevcAAB
U
12
2290
ORA-02290: check constraint (RWK.SYS_C00110133) violated
AAGY/aAAQAABevcAAD
U
14
2 rijen zijn geselecteerd.
Vor 10gR2 können Sie die SAVE EXCEPTIONS-Klausel verwenden: http://rwijk.blogspot.com/2007/11/save-exceptions.html
1 Stimmen
Ausgehend von den nachstehenden Antworten scheint es keine Möglichkeit zu geben, die tatsächliche Zeile/den tatsächlichen Wert, die den Fehler verursachen, zu ermitteln. Die beste Lösung scheint die Iteration mit einer FOR-Schleife zu sein.
0 Stimmen
Verwandte Frage: stackoverflow.com/questions/18458012/