Se uma instrução puder retornar não ou vários resultados, você não deve usar
executeQuery , mas execute() em vez disso, este método retorna um boolean indicando o tipo do primeiro resultado:true:resultado é umResultSetfalse:resultado é uma contagem de atualização
Se o resultado for
true , então você usa getResultSet() para recuperar o ResultSet , caso contrário getUpdateCount() para recuperar a contagem de atualização. Se a contagem de atualizações for -1 significa que não há mais resultados. Observe que a contagem de atualizações também será -1 quando o resultado atual é um ResultSet . Também é bom saber que getResultSet() deve retornar null se não houver mais resultados ou se o resultado for uma contagem de atualização. Agora, se você quiser recuperar mais resultados, chame
getMoreResults() (ou seu irmão aceitando um int parâmetro). O valor de retorno de boolean tem o mesmo significado de execute() , então false não significa que não há mais resultados! Só não há mais resultados se o
getMoreResults() retorna false e getUpdateCount() retorna -1 (como também documentado no Javadoc) Essencialmente, isso significa que, se você deseja processar corretamente todos os resultados, precisa fazer algo como abaixo:
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();
}
NOTA:Parte desta resposta é baseada na minha resposta para Java SQL:Statement.hasResultSet()?