A única maneira (que eu conheço) de descobrir qual linha causa o problema é usar o recurso "registrar erros em" do Oracle. Dessa forma, o
insert
não lançará uma exceção e qualquer linha que viole qualquer restrição será gravada na tabela de erros especificada. Para fazer isso, primeiro você precisa criar uma tabela de log que contenha as linhas rejeitadas:
EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('BD_VEHICLES_TEMP');
Isso criará uma tabela chamada
ERR$_BD_VEHICLES_TEMP
Em seguida, execute altere sua instrução para isso:
insert into bd_vehicles_temp
select *
from bd_vehicles_temp_1
LOG ERRORS REJECT LIMIT UNLIMITED;
A instrução continuará mesmo se uma linha não validar as restrições. Após a conclusão da instrução, você pode verificar o conteúdo da tabela
ERR$_BD_VEHICLES_TEMP
para as linhas que violaram uma restrição, incluindo a mensagem de erro e os valores. (Editar):Se você quiser parar no primeiro erro (e ver isso na tabela de log), deixe de fora o
REJECT LIMIT UNLIMITED
cláusula. Mais detalhes estão no manual:
- para DBMS_ERRLOG http://docs. oracle.com/cd/B28359_01/appdev.111/b28419/d_errlog.htm#CEGBBABI
- para a cláusula LOG ERRORS INTO:http ://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#BGBEIACB