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 é umResultSet
false
: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()?