La única forma (que conozco) de averiguar qué fila causa el problema es usar la función "registrar errores en" de Oracle. De esa forma el insert
no arrojará una excepción y cualquier fila que viole cualquier restricción se escribirá en la tabla de errores especificada.
Para hacerlo, primero debe crear una tabla de registro que contenga las filas rechazadas:
EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('BD_VEHICLES_TEMP');
Eso creará una tabla llamada ERR$_BD_VEHICLES_TEMP
Luego ejecute cambiar su declaración a esto:
insert into bd_vehicles_temp
select *
from bd_vehicles_temp_1
LOG ERRORS REJECT LIMIT UNLIMITED;
La declaración continuará incluso si una fila no valida las restricciones. Una vez finalizada la declaración, puede verificar el contenido de la tabla ERR$_BD_VEHICLES_TEMP
para las filas que violaron una restricción, incluido el mensaje de error y los valores.
(Editar):si desea detenerse en el primer error (y verlo en la tabla de registro), omita REJECT LIMIT UNLIMITED
cláusula.
Más detalles están en el manual:
- para DBMS_ERRLOG http://docs. oracle.com/cd/B28359_01/appdev.111/b28419/d_errlog.htm#CEGBBABI
- para la cláusula LOG ERRORS INTO:http ://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#BGBEIACB