web-dev-qa-db-fra.com

La méthode ExecuteBatch renvoie un tableau de valeur -2 en java

Lorsque j'exécute la méthode executeBatch en Java, elle renvoie un tableau int, mais la valeur est -2 pour tous les éléments du tableau.

il doit être 0 ou + ve qui indique le nombre de lignes affectées, mais renvoie -2,

quand j'ai vérifié dans la base de données toutes les mises à jour effectuées avec succès . expliquez svp quelle est la signification de ceci -2 et comment je trouve le nombre de lignes affectées.

Merci, Deepesh Uniyal

20
Deepesh Uniyal

La spécification jdbc a les remarques suivantes à propos du code retour des mises à jour par lots:

■ 0 ou supérieur - la commande a été traitée avec succès et la valeur est un update count indiquant le nombre de lignes de la base de données affectées par l'exécution de la commande Chapitre 14 Mises à jour par lots 121

■ Statement.SUCCESS_NO_INFO - la commande a été traitée avec succès, mais le nombre de lignes affectées est inconnu

Statement.SUCCESS_NO_INFO est défini comme étant égal à -2; votre résultat indique donc que tout a bien fonctionné, mais vous n'obtiendrez aucune information sur le nombre de colonnes mises à jour.

La documentation Oracle indique:

• Pour un lot d'instructions préparé, il n'est pas possible de connaître le nombre de lignes affectées dans la base de données par chaque instruction individuelle du lot. Par conséquent, tous les éléments du tableau ont une valeur de -2. Selon la spécification JDBC 2.0, une valeur de -2 indique que l'opération a abouti, mais que le nombre de lignes affectées est inconnu.

• Pour un lot d'instructions génériques, le tableau contient les comptes de mise à jour réels indiquant le nombre de lignes affectées par chaque opération. Le nombre de mises à jour réelles ne peut être fourni que dans le cas d'instructions génériques dans l'implémentation Oracle du traitement par lots standard.

• Pour un lot d'instructions appelable, le serveur renvoie toujours la valeur 1 en tant que nombre de mises à jour, quel que soit le nombre de lignes affectées par chaque opération.

Il semble donc que si vous avez besoin du nombre de mises à jour, vous ne pouvez pas utiliser PreparedStatements mais vous devez vous rabattre sur plain Statements.

32
piet.t

Une valeur de -2 indique qu'un élément a été traité avec succès, mais que le nombre de lignes affectées est inconnu.

specs

6

Notez que depuis Oracle 12c, cela ne devrait plus être le cas:

Pour un lot d'instructions préparé, le tableau contient les comptes de mise à jour réels indiquant le nombre de lignes affectées par chaque opération.

Voir https://docs.Oracle.com/database/121/JJDBC/oraperf.htm#JJDBC28773

1
Florent Guillaume

Mise à jour standard ...

conn.setAutoCommit(false);

PreparedStatement pstmt = 
          conn.prepareStatement("INSERT INTO employees VALUES(?, ?)");

pstmt.setInt(1, 2000);
pstmt.setString(2, "Milo Mumford");
pstmt.addBatch();

pstmt.setInt(1, 3000);
pstmt.setString(2, "Sulu Simpson");
pstmt.addBatch();

int[] updateCounts = pstmt.executeBatch();

conn.commit();

pstmt.close();
...

Vous pouvez traiter le tableau des nombres de mises à jour pour déterminer si le lot a été traité avec succès.

Traitement des erreurs dans l'implémentation Oracle du traitement par lots standard
Si l'une des opérations par lot échoue ou tente de renvoyer un jeu de résultats au cours d'un appel executeBatch, le traitement s'interrompt et une exception Java.sql.BatchUpdateException est générée.

Après une exception par lot, le tableau update count peut être récupéré à l'aide de la méthode getUpdateCounts de l'objet BatchUpdateException. Cela retourne un tableau int de comptes de mises à jour, comme le fait la méthode executeBatch. Dans l'implémentation Oracle du traitement par lots de mises à jour standard, le contenu du tableau des comptes de mises à jour est le suivant après le traitement d'un lot:

  • Pour un lot d'instructions préparé, en cas d'erreur entre l'exécution du lot , La méthode executeBatch ne peut pas renvoyer de valeur Elle lève plutôt une exception BatchUpdateException. Dans ce cas, l'exception Elle-même porte un tableau int de taille n en tant que données, où n est le nombre d'exécutions d'enregistrements ayant abouti. Par exemple, si le lot .__ est de taille 5 et que l'erreur se produit au 4ème enregistrement, l'exception BatchUpdateException possède un tableau de taille 3 (3 enregistrements exécutés avec succès) et chaque élément du tableau représente combien de rangées ont été affectées par chacune d’elles.

  • Pour un lot d'instructions génériques ou callables, le tableau update Count est uniquement un tableau partiel contenant la mise à jour réelle.
    compte jusqu’au point de l’erreur. Le nombre réel de mises à jour peut être fourni Car Oracle JDBC ne peut pas utiliser le traitement par lots vrai pour les instructions génériques et Callables dans l'implémentation Oracle de la mise à jour standard.
    traitement en lots.

Par exemple, s'il y avait 20 opérations dans le lot, les 13 premières réussies et la 14e générant une exception, le tableau des comptes de mise à jour comportera 13 éléments, contenant les comptes de mise à jour réels des opérations réussies.

Vous pouvez soit valider, soit annuler les opérations réussies dans cette situation, selon vos préférences.

Dans votre code, en cas d'échec du traitement d'un lot, vous devez être prêt à gérer le nombre de mises à jour -3 ou vraies dans les éléments du tableau lorsqu'une exception se produit. Pour un traitement par lot ayant échoué, vous aurez soit un tableau complet de -3, soit un tableau partiel d’entiers positifs.

0
mannedear