J'ai une application qui traite un fichier très volumineux et envoie des données à une base de données Oracle (à l'aide de Java 6, Oracle 9). p>
dans une boucle, j'utilise un J'ai une situation où un J'aimerais que l'exécution par lots continue, de sorte que je puisse ensuite vérifier les mises à jour échouées dans une méthode Le Javadoc sur la classe BatchupDateException dit: P>
après une commande dans une mise à jour du lot
omet d'exécuter correctement et un
BatchupDateException est lancé, existe-t-il un moyen de faire respecter la continuation ou de modifier mon programme afin qu'il exécute la déclaration individuellement? P> préparéystatement PS code> et crée toutes les instructions SQL générées avec
ps.addbatch () code>. P>
BatchupDateException BUE code> est lancé quelque part pendant le
ps.executebatch () code>. À ce stade, le lot s'arrête à être exécuté. P>
processupdatocounts (BUE.GETUPDATECounts ()) P>. P>.
4 Réponses :
Étant donné que la spécification ne semble pas le mandater (comme indiqué clairement par le Javadoc), toute continuation "forcée" devrait être effectuée à la base du conducteur. Une solution de contournement simple compatible standard serait de vérifier le tableau Bien sûr, cela semble un peu désordonné (suivre la trace du "lot" ajouté, puis vérifiant la sortie) mais fonctionnerait dans toutes les bases de données et toutes les implémentations de pilote. Juste une pensée ... p> getUpdatEcounts () Code> Retour de la matrice et "Re-exécuter" le lot pour ces déclarations qui ont échoué. Vous pouvez faire cette approche un peu plus sophistiquée en mettant dans une logique pour le nombre de tentatives. P>
vient de trouver ce lien: Problème de mise à jour de lots JDBC P>
Apparemment, il est dit qu'il y a p>
aucun moyen fort> avec oracle lot jdbc pour procéder après la première échec fort>, p> blockQuote> Je suis donc recours à l'envoi des insertions un par un. Merci p>
(Désolé de ne pas avoir l'air mieux de trouver le lien ci-dessus avant). P>
Il y a une solution de contournement qui vous permettrait d'utiliser la fonction de lot. Au lieu d'exécuter une instruction d'insertion simple, vous pouvez exécuter un bloc PL / SQL qui traitera de l'erreur de manière appropriée:
BEGIN INSERT INTO your_table VALUES (?,?,...?); EXCEPTION WHEN OTHERS THEN /* deal with the error. For example, log the error id and error msg so that you can list them after the batch */ INSERT INTO error_table VALUES (?, sqlerrm); END
Oracle lui-même peut, voir ici: HTTP : ///download.oracle.com/docload/b19306_01/AppDev.102/b14250/oci04sql.htm#sSthref616 P>
Cependant, il ne semble pas que cette fonctionnalité soit exposée à JDBC, pas même dans les classes spécifiques à Oracle. P>
En raison de la gestion des erreurs de JDBC plutôt inutiles ("Le pilote peut ou ne peut pas continuer"), je définit toujours une note de sauvegarde avant le lot et effectue un retour sur ce point sur l'erreur. C'est le seul moyen conforme JDBC d'établir un état connu après une erreur par lot oracle - autant que je sache. P>