Si une instruction peut renvoyer non ou plusieurs résultats, vous ne devez pas utiliser executeQuery , mais execute() à la place, cette méthode renvoie un boolean indiquant le type du premier résultat :
true:le résultat est unResultSetfalse:le résultat est un nombre de mises à jour
Si le résultat est true , alors vous utilisez getResultSet() pour récupérer le ResultSet , sinon getUpdateCount() pour récupérer le nombre de mises à jour. Si le nombre de mises à jour est -1 cela signifie qu'il n'y a plus de résultats. Notez que le nombre de mises à jour sera également -1 lorsque le résultat courant est un ResultSet . Il est également bon de savoir que getResultSet() doit renvoyer null s'il n'y a plus de résultats ou si le résultat est un nombre de mises à jour.
Maintenant, si vous voulez récupérer plus de résultats, vous appelez getMoreResults() (ou son frère acceptant un int paramètre). La valeur de retour de boolean a la même signification que celle de execute() , donc false ne signifie pas qu'il n'y a plus de résultats !
Il n'y a plus de résultats uniquement si getMoreResults() renvoie faux et getUpdateCount() renvoie -1 (comme également documenté dans le Javadoc)
Cela signifie essentiellement que si vous voulez traiter correctement tous les résultats, vous devez faire quelque chose comme ci-dessous :
boolean result = stmt.execute(...);
while(true)
if (result) {
ResultSet rs = stmt.getResultSet();
// Do something with resultset ...
} else {
int updateCount = stmt.getUpdateCount();
if (updateCount == -1) {
// no more results
break;
}
// Do something with update count ...
}
result = stmt.getMoreResults();
}
REMARQUE :Une partie de cette réponse est basée sur ma réponse à Java SQL :Statement.hasResultSet() ?