L'unico modo (che conosco) per scoprire quale riga causa il problema è utilizzare la funzione "registra errori in" di Oracle. In questo modo insert
non genererà un'eccezione e qualsiasi riga che viola qualsiasi vincolo verrà scritta nella tabella degli errori specificata.
Per farlo devi prima creare una tabella di log che contenga le righe rifiutate:
EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('BD_VEHICLES_TEMP');
Ciò creerà una tabella denominata ERR$_BD_VEHICLES_TEMP
Quindi esegui cambia la tua dichiarazione in questo:
insert into bd_vehicles_temp
select *
from bd_vehicles_temp_1
LOG ERRORS REJECT LIMIT UNLIMITED;
L'istruzione continuerà anche se una riga non riesce a convalidare i vincoli. Al termine dell'istruzione puoi controllare il contenuto della tabella ERR$_BD_VEHICLES_TEMP
per le righe che hanno violato un vincolo incluso il messaggio di errore ei valori.
(Modifica):se vuoi fermarti al primo errore (e vederlo nella tabella di registro), lascia fuori il REJECT LIMIT UNLIMITED
clausola.
Maggiori dettagli sono nel manuale:
- per DBMS_ERRLOG http://docs. oracle.com/cd/B28359_01/appdev.111/b28419/d_errlog.htm#CEGBBABI
- per la clausola LOG ERRORS INTO:http ://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#BGBEIACB