Rs.RowCount(); Como fazer isso em java?

17 respostas
R
rs.RowCount

No vbscript tem essa função que informa a quantidade de linhas que a sua query retornou.
E em java, como fazer isso? Não achei nenhum método até agora da classe ResultSet que faça isto.

Será possível que vou ter que executar um SELECT COUNT toda vez que precisar obter a quantidade de linhas retornadas por uma query??

[]´s!!!

17 Respostas

R

Isso ou durante o while(rs.next()) incrementar um contador… :confused:

Já vi alguns sites com esta disucssão, dá uma googlada que você acha…

V

A maneira em Java é pouco elegante, chega a parecer xunxo.

Mas é assim.

//Crie um result statement navegável
Statement stmt = conn.createStatement(
   ResultSet.TYPE_SCROLL_INSENSITIVE, 
   ResultSet.CONCUR_READ_ONLY); 

ResultSet rs = stmt.executeQuery(sql); //Rode um sql qualquer
rs.last();   //Vá para a última linha do resultSet:
int rows = rs.getRow();   //Pegue o número da linha
rs.beforeFirst();  //Se necessário, volte para o início.
R

Aêêêê!!!
Mandou muito bem!!! :smiley:
Valeu!!!
[]´s!!!

J
ViniGodoy:
A maneira em Java é pouco elegante, chega a parecer xunxo.

Mas é assim.

//Crie um result statement navegável
Statement stmt = conn.createStatement(
   ResultSet.TYPE_SCROLL_INSENSITIVE, 
   ResultSet.CONCUR_READ_ONLY); 

ResultSet rs = stmt.executeQuery(sql); //Rode um sql qualquer
rs.last();   //Vá para a última linha do resultSet:
int rows = rs.getRow();   //Pegue o número da linha
rs.beforeFirst();  //Se necessário, volte para o início.

so lembrando que nem todos drivers implementam corretamento a a navegacao no ResultSet.

[]'s

V
resultSet.getMetaData().getColumnCount();

Mas fácil.

R

vitu:
resultSet.getMetaData().getColumnCount();

Mas fácil.


Vitu, estamos falando sobre a contagem de linhas, e não de colunas ok?!

Aí Vini, quando eu chamo o rs.last() dá a seguinte exceção!!! (já rolou contigo isso?) =/

java.sql.SQLException: Operação inválida para encaminhar apenas conjunto de resultados: last
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)

Tava bom d+…
Será q é por causa do que o jgbt falou???

J

Rage:
Vitu, estamos falando sobre a contagem de linhas, e não de colunas ok?!

Aí Vini, quando eu chamo o rs.last() dá a seguinte exceção!!! (já rolou contigo isso?) =/

java.sql.SQLException: Operação inválida para encaminhar apenas conjunto de resultados: last
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)

Tava bom d+…
Será q é por causa do que o jgbt falou???

vc ta usando bd oracle?
se sim, o driver da oracle implementa corretamente a navegacao no ResultSet
me parece que vc nao ta usando o driver padrao da oracle.

[]'s

V

Pq não usa o driver Oracle thin, que vem junto dos arquivos da própria Oracle?

Ele funciona bem para isso, já testamos.

R

Sim, estou usando Oracle 9i!

Antes de ver a questão do driver, creio que posso estar fazendo algo de maneira equivocada:
Ao criar meu ResultSet, não estou sabendo como setar o tipo de scroll.
Acho falta as configurações que você citou
(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY)

try { String query = "SELECT * FROM user.tablej WHERE rownum <= 8"; conn = getConnection(); pstmt = conn.prepareStatement(query); rs = pstmt.executeQuery(); rs.last(); int rsSize = rs.getRow();
Como configuro isto usando PreparedStatement ao invés do Statement?
O driver que estou usando é o classes12.jar (baixei no próprio site da oracle)

[]´s!!!

R

Beleza kras, acho que conseguí!!! :slight_smile:

try { String query = "SELECT * FROM user.tablex WHERE rownum <= 20"; conn = getConnection(); pstmt = conn.prepareStatement(query,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = pstmt.executeQuery(); rs.last(); int rsSize = rs.getRow(); System.out.println("rsSize: "+ rsSize);Valeu pela ajuda!!! 8)
[]´s!

V

Mas… vamos falar a verdade… soluçãozinha tosca, né?

Achei a recomendação num site da sun…

L

Rage:
Beleza kras, acho que conseguí!!! :slight_smile:

try { String query = "SELECT * FROM user.tablex WHERE rownum <= 20"; conn = getConnection(); pstmt = conn.prepareStatement(query,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = pstmt.executeQuery(); rs.last(); int rsSize = rs.getRow(); System.out.println("rsSize: "+ rsSize);Valeu pela ajuda!!! 8)
[]´s!

Prefiro muito mais criar um método com “SELECT COUNT…” e chamá-lo toda vez que precisar atualizar a quantidade de linhas…
Esse método não me inspira muita confiança não…
Rsrsrs…

R

ViniGodoy:
Mas… vamos falar a verdade… soluçãozinha tosca, né?
Achei a recomendação num site da sun…

Verdade, solução tosca.
Difícil acreditar que os caras não pensaram em algo mais prático pra obter isso, uma coisa tão elementar, tão básica e essencial…

Linkel:
Prefiro muito mais criar um método com “SELECT COUNT…” e chamá-lo toda vez que precisar atualizar a quantidade de linhas…
Esse método não me inspira muita confiança não…
Rsrsrs…

Tem razão, se houver tempo vou criar um método genérico que possa de alguma maneira ser acessado retornando o count de diferentes queryes…por hora vai ficar assim mesmo, pois está funcionando!
[]´s

C

Linkel:
Rage:
Beleza kras, acho que conseguí!!! :slight_smile:

try { String query = "SELECT * FROM user.tablex WHERE rownum <= 20"; conn = getConnection(); pstmt = conn.prepareStatement(query,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = pstmt.executeQuery(); rs.last(); int rsSize = rs.getRow(); System.out.println("rsSize: "+ rsSize);Valeu pela ajuda!!! 8)
[]´s!

Prefiro muito mais criar um método com “SELECT COUNT…” e chamá-lo toda vez que precisar atualizar a quantidade de linhas…
Esse método não me inspira muita confiança não…
Rsrsrs…

E duplicar o acesso ao banco para essas queries? Sei lá, tem que ver com calma se sempre vale à pena isso…

V

Realmente, o SELECT COUNT pode ficar mais elegante, mas duplica o acesso ao banco.

J

na real dependendo da situação, cada solução pode ser util.
se é para otimizar, vale apena criar um contador e incrementa-lo dentro do while do ResultSet, semprecisar nem mesmo navegar no ResultSet para descobri o numero de linhas.

[]'s

G

Cara,

Se vc precisa do rowcount no final da varredura do ResultSet, faça um contador. Senão, a melhor solução é tu criar um método que englobe o teu select principal com o “SELECT COUNT(1) AS ROW_COUNT FROM (” + teu SQL + “)” para fazer o count da tua consulta. Lembrando que será mais performático tu usar a mesma connection. Se nao me engano nas novas versões do jdbc ja tem coisa implementada pra isso.

Criado 4 de outubro de 2007
Ultima resposta 9 de out. de 2007
Respostas 17
Participantes 8