Méthode de retour de la méthode ExecuteBatch tableau de valeur -2 en java

quand j'exécute la méthode executeBatch en java, c'est retourner un tableau int qui est bien mais la valeur est -2 de tous les éléments du tableau,

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

quand je l'ai vérifié dans la base de données toutes les mises à jour effectuées avec succès. s'il vous plaît expliquer ce que signifie ce -2 et comment je trouve le nombre de lignes affectées.

Merci, Deepesh Uniyal!--1-->

18
demandé sur Deepesh Uniyal 2013-09-26 11:40:29

4 réponses

le JDBC-spec a ce qui suit à dire au sujet du code de retour des mises à jour par lots:

■ 0 ou plus-la commande a été traitée avec succès et la valeur est compte de mise à jour indiquant le nombre de lignes dans la base de données qui ont été affectées par la commande de l'exécution Chapitre 14 Mises À Jour Des Lots 121

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

Déclaration.SUCCESS_NO_INFO est défini comme étant -2, donc votre résultat indique que tout a bien fonctionné, mais vous n'obtiendrez pas d'informations sur le nombre de colonnes mises à jour.

oracle-états de documentation:

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

• Pour un lot de déclaration générique, le tableau contient les comptes de mise à jour réels indiquant le nombre de lignes affectées par chaque opération. Les comptes de mise à jour réels peuvent être fournis seulement dans le cas d'énoncés génériques dans la mise en œuvre Oracle de batching standard.

• Pour un lot de déclarations appelant, le serveur renvoie toujours la valeur 1 comme le compte de mise à jour, indépendamment des lignes de nombre affectées par chaque opération.

il semble donc que si vous avez besoin de la mise à jour-counts vous ne pouvez pas utiliser PreparedStatement s mais doivent se replier sur plainStatement S.

28
répondu piet.t 2013-09-26 09:05:17

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

spécifications

5
répondu Thirumalai Parthasarathi 2015-07-14 11:20:49

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

pour un lot d'instruction préparé, le tableau contient le nombre réel de mises à jour indiquant le nombre de lignes affectées par chaque opération.

voir https://docs.oracle.com/database/121/JJDBC/oraperf.htm#JJDBC28773

1
répondu Florent Guillaume 2017-04-24 15:50:28

Mise À Jour Standard Batching...

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 update counts pour déterminer si le lot a été traité avec succès.

traitement des erreurs dans la mise en œuvre Oracle de la mise en œuvre Standard de la mise en lots

Si l'une quelconque des groupées des opérations échoue ou tente de retourner un ensemble de résultats lors d'une executeBatch, le traitement s'arrête et java.SQL.BatchUpdateException est générée.

Après une exception de lot, le tableau update counts peut être récupéré en utilisant la méthode getUpdateCounts de L'objet BatchUpdateException. Cela renvoie un tableau int des comptes de mise à jour, comme le fait la méthode executeBatch. Dans L'implémentation Oracle de la mise à jour standard batching, les contenus du tableau update counts sont les suivants, après traitement d'un lot:

  • pour un lot de déclaration préparé, en cas d'erreur entre l'exécution du traitement, la méthode executeBatch ne peut pas retourner valeur, à la place il lance une BatchUpdateException. Dans ce cas, l' l'exception elle-même porte un tableau int de la taille n comme ses données, où n est le nombre d'exécutions record réussies. Par exemple, si l' lot est de taille 5 et l'erreur se produit lors de la 4e, le BatchUpdateException a un tableau de taille 3 (3 enregistrements exécutés avec succès) et chaque élément dans le tableau représente combien de lignes ont été touchés par chacun d'eux.

  • Pour un générique déclaration par lot ou par appel déclaration par lot, la mise à jour compte tableau est seulement partielle d'un tableau contenant la mise à jour réelle

    compte jusqu'à le moment de l'erreur. Les comptes de mise à jour réels peuvent être fourni parce que Oracle JDBC ne peut pas utiliser vrai batching pour générique et callable états dans l'Oracle de la mise en œuvre de la norme de mise à jour

    le traitement par lots.

par exemple, s'il y avait 20 opérations dans le lot, les 13 premières ont réussi, et le 14 généré une exception, alors le tableau update counts aura 13 éléments, contenant les comptes de mise à jour réels des opérations réussies.

Vous pouvez soit vous engager, soit faire reculer les opérations réussies dans cette situation, comme vous le préférez.

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

0
répondu mannedear 2018-04-23 15:19:21