Total de registros de uma recordset

18 respostas
proteus_adi
Statement stmt = conn.createStatement();

ResultSet rset = stmt.executeQuery(select nome from algo_tst);

// Print the name out

String s_rcount;

s_rcount = ?;// numero de registros retornados

como é?

18 Respostas

T

Normalmente você percorre o recordset para contar quantos registros, ou então usa uma query como “SELECT COUNT(*)”.

Problemas do SELECT COUNT(*):

  • Alguns bancos (como o SQL Server) processam SELECT COUNT(*) muito devagar.
  • Se você tem algo como:
    SELECT COUNT () WHERE cond
    alocar um array contendo os N registros necessários
    SELECT ____ WHERE cond
    você (a menos que use uma transação) pode ter um caso em que entre o SELECT COUNT(
    ) e o SELECT____ para recuperar os dados aconteça de a contagem ser alterada no pequeno espaço de tempo da alocação do array, obtendo menos ou mais linhas que o esperado.

Percorrer o recordset e contar quantos registros é melhor, basta usar um ArrayList em vez de um array para guardar os registros que foram lidos.

keller

uma solução ruim mas funcional…

int numeroRegistros = 0;

while (resultSet.next()){
  numeroRegistros++;
}

resultSet.first();

percorre o resultset contando o numero de registro
e depois lhe tras para o 1o

valeu ? t+ :wink:

kuchma

Diz a lenda que:

:arrow: SELECT COUNT(coluna_indexada) eh mais rapido do que SELECT COUNT(*).

:arrow: SELECT COUNT(1) eh melhor do que a opcao anterior.

Alguem sabe se isso procede?

Marcio Kuchma

proteus_adi
int s_rcount;

rset.last();

s_rcount = rset.getRow();

rset.first();

isso ai num funciona naum???

aborges

Nao gosto muito da ideia de utilizar o “last()” e depois o “first()”, pq vc tem que abrir um resultset que suporte FORWARD E BACKWARD, o que nao eh tao bom pra performace qt os TYPE_FORWARD_ONLY…

Prefiro fazer um count dos registros no select !

Z

Se você tem um resultset muito pesado, não é uma boa alternativa iterá-lo todo, fazendo um contador, pra saber a quantidade de registros. Isso pode afetar muito o desempenho do seu sistema. Não sei se há muita diferença entre pecorrer o resultset todo e usar o método last().

Mas, por outro lado, nem sempre é possível criar uma nova consulta, do tipo “select count(*)…”, só pra saber a quantidade de registros.

Recomendo você fazer um teste antes, testando as alternativas. A que apresentar um menor custo pro sistema, você usa. :wink:

aborges

Perfeito!

Com dizem por aih… “Cada caso é um caso…”

L

Vc pode usar o metodo getFetchSize() para retornar o tamanho do resultset.

Isso so funciona se o driver que vc esta usando tiver esse metodo implementado. Nada como exerimentar!

smota

Nonon … o fetchsize só diz quantos registros o recordset traz do banco a cada requisição … nao tem necessariamente a ver com a quantidade de registros do result.

keller

só ressaltando é uma solução ruim mas funcional a que eu passei…
valeu ? t+ ai… :wink:

S

Em sistemas que eu preciso saber quantos registros tenho em cada tabela, eu costumo criar outra tabela com tais dados. Eh uma dor de cabeca pro desenvolvedor pq eh mais inserts e deletes no codigo, mas a longo prazo traz menos dor de cabeca e eu acho a gambiarra mais bonita de todas hehehe.

aborges

:shock: Eh :roll:

Digamos q vc tenha uma tabela de 10 Milhoes de registros e quer selecionar 1 Milhao… Vc seleciona os dados desta, deleta os da tabela temporaria, insere seus 1 Milha de registros lah e conta qts tem??

Alem disso, como vc garante concorrencia? Tipo, 2 carinhas rodando o programa ao mesmo tempo? Vc criou uma chave na “tabela temporaria” pra fazer saber de qual processo sao aqueles dados…

Nao entendi muito bem a solucao nao …

proteus_adi

puxa vida!
que polêmica!!!

em questão à minha sujestão e a sujestão do alce ai…
eu acho que deve dar quase no mesmo… pois o programa deve colocar todos os dados em buffer…
a sujestão e técnica do kra que cria tabelas parece boas,
assim esta tabela pode ainda ser usado pra gerar sequencies, deixando toda regra , inclusive a de geração de sequencies no programa…[embora não seja tão válido assim pra relacionamentos]

quando eu tenho uma tabela de fatos e uma de detalhes, isso não funciona…
receio que eu tenha que buffetizar todos os dados da tabela só pra saber quandos registros tem…


eu tentei um tal de

getArray(1).getLength();
mas deu erro…

pode ser que esta seja uma boa solução…
alguem me ajuda a implementar essa lógica?!
ou se não for tão boa…
me avisem

kuchma

Pronto. Isso aqui resolve. Se voce tem que iterar pelo ResultSet para fazer alguma coisa com ele que NAO seja exibir diretamente (o que geralmente eh o mais “correto”), aproveite e va incrementando um contador. No final voce tem o buffer/lista/etc e o contador prontinhos para uso. Sem dor-de-cabeca.

IMHO, o recurso de verificar a quantidade de linhas no ResultSet sem ter que percorre-lo poderia ser obrigatorio na especificacao do JDBC. Nao parece ser tao dificil fazer o driver JDBC devolver essa informacao. :smiley:

Marcio Kuchma

proteus_adi

eu não falei deve no sentido de VAI TER QUE COLOCAR, e sim deve no sentido de INFELIZMENTE VOU GASTAR MEMORIA!!

SACOU?!

kuchma

proteus_adi:
eu não falei deve no sentido de VAI TER QUE COLOCAR, e sim deve no sentido de INFELIZMENTE VOU GASTAR MEMORIA!!

SACOU?!

Nao. O que voce quer fazer?

  1. Apenas saber a quantidade de registros. Use SELECT COUNT.

  2. Puxar os dados e saber a quantidade de registros. Faca o SELECT normalmente, jogue numa lista e no processo incremente o contador. Voce nao ia jogar numa lista? Ia passar diretamente para a view sem intermediarios? Se sim, entao realmente nao ha como. Faca um SELECT COUNT antes do SELECT normal.

Quanto a armazenar a informacao em outra tabela, nesse caso acaba dando mais trabalho pois pra saber a quantidade voce vai ter que fazer um SELECT de qualquer jeito (exceto se fizer algum join exdruxulo com a tabela da consulta principal). E ainda tem o trampo da manutencao dessa tabela auxiliar.

Nao ha ainda a solucao ideal.

Marcio Kuchma

proteus_adi

no site da sun eu achei isso:

If your JDBC driver allows it, and assuming your ResultSet is an instance variable:

private int getResultsCount() throws SQLException {

_rs.last();

int numResults = _rs.getRow();

_rs.beforeFirst();
return numResults;

}

proteus_adi

ei!!!
como é que eu faço!!!
tá dando erro!!!
que parametros eu tenho que passar…

Criado 29 de novembro de 2004
Ultima resposta 1 de dez. de 2004
Respostas 18
Participantes 9