Traitement des exceptions de mise à jour par lots hétérogènes

Si une erreur se produit lors d'une mise à jour par lots hétérogènes, une exception élément com.ibm.pdq.runtime.exception.UpdateManyException est émise. Vous pouvez récupérer des informations sur les exceptions et sur les instructions SQL qui génèrent des exceptions. Une exception com.ibm.pdq.runtime.exception.HeteroBatchSQLException contient les informations d'erreur SQL.

Pour récupérer un tableau à deux dimensions int qui contient le nombre des mises à jour par lots hétérogènes effectuées, appelez la méthode UpdateManyException.getUpdateCounts(). Ce tableau contient le compage de mises à jour qui serait renvoyé si le lot est terminé avec succès.

Les valeurs du tableau correspondent aux nombres de mises à jour effectuées ou à un élément Java™ EXECUTE_FAILED. Les informations contenues dans le tableau permettent de trouver où se trouvent les erreurs.

Vous pouvez récupérer les exceptions de l'une des manières suivantes :

Exemple

Dans l'exemple suivant de lot hétérogène, six mises à jour sont effectuées. Pendant l'exécution du lot, les événements suivants se produisent :
  1. La mise à jour par lots à l'aide de la méthode updateMany() effectue trois insertions dans la table A.
  2. Une instruction SQL UPDATE unique modifie cinq lignes de la table F.
  3. Une instruction SQL INSERT unique dans la table B échoue avec une exception SqlIntegrityConstraintViolationException car elle tente d'insérer une clé primaire existante.
  4. Une instruction SQL DELETE unique supprime cinq lignes de la table G.
  5. Une mise à jour par lots réalisée à l'aide de la méthode updateMany() effectue deux insertions dans la table H. Ces deux insertions échouent avec une exception SqlIntegrityConstraintViolationException car elles tentent d'insérer une clé primaire existante.
  6. Une instruction SQL INSERT unique dans la table I.
Une exception UpdateManyException est émise :

com.ibm.pdq.runtime.exception.UpdateManyException : [pdq][10363][3.200.401] Une ou plusieurs exceptions se sont produites alors que pureQuery exécutait le lot d'instructions SQL hétérogènes.

La méthode getHeterogeneousUpdateCounts () permet de renvoyer un tableau à deux dimensions int de comptage des mises à jour effectuées pour identifier les instructions SQL en échec. Le tableau suivant répertorie le contenu du tableau :

Tableau 1. Tableau contenant le comptage de mises à jour par lots hétérogènes effectuées
Indice de tableau Nombre1
[0][0] 1
[0][1] 1
[0][2] 1
[1][0] 5
[2][0] EXECUTE_FAILED
[3][0] 5
[4][0] EXECUTE_FAILED
[4][1] EXECUTE_FAILED
[5][0] 1
Remarque :
  1. EXECUTE_FAILED est l'élément java.sql.Statement.EXECUTE_FAILED constant défini par la connectivité JDBC.
Vous pouvez récupérer les exceptions à l'aide des méthodes suivantes :
  • UpdateManyException.getHeteroBatchSQLExceptionArray (), qui renvoie un tableau qui contient des exceptions HeteroBatchSQLException spécifiques à une ligne. S'il existe plusieurs exceptions pour une même ligne, elles sont chaînées entre elles.
  • UpdateManyException.getBatchNonSpecificExceptions(), qui renvoie des exceptions HeteroBatchSQLException non spécifiques à une ligne.

Le tableau suivant répertorie le contenu du tableau renvoyé par UpdateManyException.getHeteroBatchSQLExceptionArray() :

Tableau 2. Tableau contenant des exceptions HeteroBatchSQLException spécifiques à des lignes
Indice de tableau Valeur
[0][0] null
[0][1] null
[0][2] null
[1][0] null
[2][0] HeteroBatchSQLException contenant les informations suivantes :

com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException : erreur pour l'élément de lot n° 1 : ds instruction n° 3 : une ou plusieurs valeurs dans l'instruction INSERT ou UPDATE, ou la mise à jour de clé externe déclenchée par une instruction DELETE ne sont pas valides car la clé primaire, la contrainte d'unicité ou l'index à entrées uniques identifié(e) par "1" empêche la table "DB2ADMIN.G" d'avoir des valeurs dupliquées pour la clé d'index.

[3][0] null
[4][0] HeteroBatchSQLException contenant les informations suivantes :

com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException : erreur pour l'élément de lot n° 1 : ds instruction n° 5 : une ou plusieurs valeurs dans l'instruction INSERT ou UPDATE, ou la mise à jour de clé externe déclenchée par une instruction DELETE ne sont pas valides car la clé primaire, la contrainte d'unicité ou l'index à entrées uniques identifié(e) par "1" empêche la table "DB2ADMIN.H" d'avoir des valeurs dupliquées pour la clé d'index.

[4][1] HeteroBatchSQLException contenant les informations suivantes :

com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException : erreur pour l'élément de lot n° 2 : ds instruction n° 5 : une ou plusieurs valeurs dans l'instruction INSERT ou UPDATE, ou la mise à jour de clé externe déclenchée par une instruction DELETE ne sont pas valides car la clé primaire, la contrainte d'unicité ou l'index à entrées uniques identifié(e) par "1" empêche la table "DB2ADMIN.H" d'avoir des valeurs dupliquées pour la clé d'index.

[5][0] null

UpdateManyException.getBatchNonSpecificExceptions() renvoie une valeur null car il n'existe aucune exception SQLException non spécifique à une ligne.

Vous pouvez appeler les méthodes UpdateManyException.getCause() et UpdateManyException.getNextException() pour récupérer les exceptions HeteroBatchSQLException chaînées. La liste suivante répertorie les exceptions HeteroBatchSQLException renvoyées à l'aide des méthodes getCause() et getNextException().

  1. L'appel de getCause() renvoie la cause suivante :

    com.ibm.db2.jcc.am.BatchUpdateException : [jcc][102][10040][3.63.46] Echec de lot. Le lot a été soumis, mais une ou plusieurs exceptions se sont produites sur un membre individuel du lot. Utilisez getNextException() pour récupérer les exceptions pour des éléments en lot spécifiques.

  2. Le premier appel de getNextException() renvoie une exception HeteroBatchSQLException qui contient les informations suivantes :

    com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException : erreur pour l'élément de lot n° 1 : ds instruction n° 3 : une ou plusieurs valeurs dans l'instruction INSERT ou UPDATE, ou la mise à jour de clé externe déclenchée par une instruction DELETE ne sont pas valides car la clé primaire, la contrainte d'unicité ou l'index à entrées uniques identifié(e) par "1" empêche la table "DB2ADMIN.G" d'avoir des valeurs dupliquées pour la clé d'index.

  3. Le second appel de getNextException() renvoie une exception HeteroBatchSQLException qui contient les informations suivantes :

    com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException : erreur pour l'élément de lot n° 1 : ds instruction n° 5 : une ou plusieurs valeurs dans l'instruction INSERT ou UPDATE, ou la mise à jour de clé externe déclenchée par une instruction DELETE ne sont pas valides car la clé primaire, la contrainte d'unicité ou l'index à entrées uniques identifié(e) par "1" empêche la table "DB2ADMIN.H" d'avoir des valeurs dupliquées pour la clé d'index.

  4. Le troisième appel de getNextException() renvoie une exception HeteroBatchSQLException qui contient les informations suivantes :

    com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException : erreur pour l'élément de lot n° 2 : ds instruction n° 5 : une ou plusieurs valeurs dans l'instruction INSERT ou UPDATE, ou la mise à jour de clé externe déclenchée par une instruction DELETE ne sont pas valides car la clé primaire, la contrainte d'unicité ou l'index à entrées uniques identifié(e) par "1" empêche la table "DB2ADMIN.H" d'avoir des valeurs dupliquées pour la clé d'index.

  5. Le quatrième appel de getNextException() renvoie la valeur

    null


Commentaires en retour