Jeśli oświadczenie może zwrócić nie lub wiele wyniki, nie powinieneś używać executeQuery , ale execute() zamiast tego ta metoda zwraca boolean wskazując typ pierwszego wyniku:
true:wynik toResultSetfalse:wynik to liczba aktualizacji
Jeśli wynik jest true , następnie użyj getResultSet() aby pobrać ResultSet , w przeciwnym razie getUpdateCount() aby pobrać licznik aktualizacji. Jeśli licznik aktualizacji wynosi -1 oznacza to, że nie ma więcej wyników. Pamiętaj, że licznik aktualizacji będzie również wynosił -1 gdy bieżący wynik to ResultSet . Warto również wiedzieć, że getResultSet() powinien zwrócić wartość null, jeśli nie ma więcej wyników lub jeśli wynik jest liczbą aktualizacji.
Teraz, jeśli chcesz pobrać więcej wyników, wywołaj getMoreResults() (lub jego brat akceptujący int parametr). Zwracana wartość boolean ma takie samo znaczenie jak execute() , więc false nie oznacza, że nie ma więcej wyników!
Nie ma więcej wyników tylko wtedy, gdy getMoreResults() zwraca false i getUpdateCount() zwraca -1 (jak również udokumentowano w Javadoc)
Zasadniczo oznacza to, że jeśli chcesz poprawnie przetworzyć wszystkie wyniki, musisz zrobić coś takiego jak poniżej:
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();
}
UWAGA:Część tej odpowiedzi jest oparta na mojej odpowiedzi na Java SQL:Statement.hasResultSet()?