Estive dando uma olhada na API da java.sql.ResultSet e reparei que não há nenhum método que retorna o tamanho desta, ou seja, quantas linhas obtive da query. Obviamente posso correr por todo o ResultSet até o final com um contador e depois contar quantas linhas obtive. Creio que ficaria assim:
int numLinhas = 0;
while(rs.next()) {
numLinhas ++;
}
System.out.println("Há " + numLinhas + " linhas na query.");
Mas como determinar a priori? Será que isso depende da implementação de cada driver?
Alguns bancos não tem como saber o número de registros retornados em um ResultSet devido a otimizacoes feitas no driver (é meio ‘caro’ saber o tamanho de um ResultSet às vezes). Mas, se vc está iterando sobre o ResultSet de alguma maneira, aproveite pra usar um contador, ou então faça dois SELECTs, um pra pegar os dados e outro com um count().
É… mas para isso funcionar vc deve usar um Statement rolável
o q é muito caro em termos de instanciação.
Sei que existem situações onde queremos saber o tamanho do ResultSet, mas no mundo real o que se faz é popular um ArrayList com as linhas, e como na maioria das vezes nós adicionamos TODAS as linhas do ResultSet, basta usar o metodo size após popular o ArrayList.
Parece meio bobo, mas faz uma boa diferença entre Statement’s simples e Statement roláveis no quisito desempenho e uso de recursos.
É claro que usando ou não Statement’s simples vc irá popular o ArrayList, entaum por que gastar duas vezes não é mesmo !!
Bem… eu tenho um caso onde recupero o resultado de uma stored procedure e gero um CSV.
Na primeita linha do meu CSV, eu preciso colocar o tamanho do arquivo, quantos registros a SP me retornou.
Não seria um problema jogar tudo em uma lista e depois pegar o tamanho da lista… o problema é que a SP me retorna cerca de 60000 linhas!!! e para optimizar a performance, escrevo o CSV direto com o resultado da stored procedure devidamente formatada.
Para a posteridade: creio que a forma certa de resolver isto seria contar o número de resultados no banco de dados (com os devidos indexes para tabelas grandes).
Por exemplo, no Postgresql você faria:
SELECT COUNT(*) as rowCount FROM users WHERE age > 21;