Det enda sättet (jag känner till) att ta reda på vilken rad som orsakar problemet är att använda Oracles "logga in fel i"-funktion. På det sättet insert
kommer inte att skapa ett undantag och alla rader som bryter mot någon begränsning kommer att skrivas in i den angivna feltabellen.
För att göra det måste du först skapa en loggtabell som innehåller de avvisade raderna:
EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('BD_VEHICLES_TEMP');
Det skapar en tabell med namnet ERR$_BD_VEHICLES_TEMP
Kör sedan ändra ditt uttalande till detta:
insert into bd_vehicles_temp
select *
from bd_vehicles_temp_1
LOG ERRORS REJECT LIMIT UNLIMITED;
Uttalandet fortsätter även om en rad inte validerar begränsningarna. När satsen är klar kan du kontrollera innehållet i tabellen ERR$_BD_VEHICLES_TEMP
för raderna som bröt mot en begränsning inklusive felmeddelandet och värdena.
(Redigera):Om du vill sluta vid det första felet (och se det i loggtabellen), utelämna REJECT LIMIT UNLIMITED
klausul.
Mer information finns i manualen:
- för DBMS_ERRLOG http://docs. oracle.com/cd/B28359_01/appdev.111/b28419/d_errlog.htm#CEGBBABI
- för LOG ERRORS INTO-satsen:http ://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#BGBEIACB