Den eneste måde (jeg kender til) at finde ud af, hvilken række der forårsager problemet, er at bruge Oracles "log fejl ind" funktion. På den måde insert
vil ikke give en undtagelse, og enhver række, der overtræder en begrænsning, vil blive skrevet ind i den angivne fejltabel.
For at gøre det skal du først oprette en logtabel, der indeholder de afviste rækker:
EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('BD_VEHICLES_TEMP');
Det vil skabe en tabel med navnet ERR$_BD_VEHICLES_TEMP
Kør derefter ændre dit udsagn til dette:
insert into bd_vehicles_temp
select *
from bd_vehicles_temp_1
LOG ERRORS REJECT LIMIT UNLIMITED;
Udsagnet fortsætter, selvom en række ikke validerer begrænsningerne. Når sætningen er færdig, kan du kontrollere indholdet af tabellen ERR$_BD_VEHICLES_TEMP
for de rækker, der overtrådte en begrænsning, inklusive fejlmeddelelsen og værdierne.
(Rediger):Hvis du vil stoppe ved den første fejl (og se det i logtabellen), så udelad REJECT LIMIT UNLIMITED
klausul.
Flere detaljer findes i manualen:
- til DBMS_ERRLOG http://docs. oracle.com/cd/B28359_01/appdev.111/b28419/d_errlog.htm#CEGBBABI
- for LOG ERRORS INTO-klausulen:http ://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#BGBEIACB