La seule façon (que je connaisse) de savoir quelle ligne cause le problème est d'utiliser la fonction "enregistrer les erreurs dans" d'Oracle. De cette façon, le insert
ne lèvera pas d'exception et toute ligne violant une contrainte sera écrite dans la table d'erreurs spécifiée.
Pour ce faire, vous devez d'abord créer une table de journal contenant les lignes rejetées :
EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('BD_VEHICLES_TEMP');
Cela créera une table nommée ERR$_BD_VEHICLES_TEMP
Exécutez ensuite la modification de votre déclaration :
insert into bd_vehicles_temp
select *
from bd_vehicles_temp_1
LOG ERRORS REJECT LIMIT UNLIMITED;
L'instruction continuera même si une ligne ne parvient pas à valider les contraintes. Une fois la déclaration terminée, vous pouvez vérifier le contenu de la table ERR$_BD_VEHICLES_TEMP
pour les lignes qui ont violé une contrainte, y compris le message d'erreur et les valeurs.
(Edit) :Si vous voulez vous arrêter à la première erreur (et voir cela dans le tableau du journal), alors omettez le REJECT LIMIT UNLIMITED
clause.
Plus de détails sont dans le manuel :
- pour DBMS_ERRLOG http://docs. oracle.com/cd/B28359_01/appdev.111/b28419/d_errlog.htm#CEGBBABI
- pour la clause LOG ERRORS INTO :http ://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#BGBEIACB