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??
Isso ou durante o while(rs.next()) incrementar um contador…
Já vi alguns sites com esta disucssão, dá uma googlada que você acha…
V
ViniGodoy
A maneira em Java é pouco elegante, chega a parecer xunxo.
Mas é assim.
//Crie um result statement navegávelStatementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);ResultSetrs=stmt.executeQuery(sql);//Rode um sql qualquerrs.last();//Vá para a última linha do resultSet:introws=rs.getRow();//Pegue o número da linhars.beforeFirst();//Se necessário, volte para o início.
R
Rage
Aêêêê!!!
Mandou muito bem!!!
Valeu!!!
[]´s!!!
J
jgbt
ViniGodoy:
A maneira em Java é pouco elegante, chega a parecer xunxo.
Mas é assim.
//Crie um result statement navegávelStatementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);ResultSetrs=stmt.executeQuery(sql);//Rode um sql qualquerrs.last();//Vá para a última linha do resultSet:introws=rs.getRow();//Pegue o número da linhars.beforeFirst();//Se necessário, volte para o início.
so lembrando que nem todos drivers implementam corretamento a a navegacao no ResultSet.
[]'s
V
vitu
resultSet.getMetaData().getColumnCount();
Mas fácil.
R
Rage
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
jgbt
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
ViniGodoy
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
Rage
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
Rage
Beleza kras, acho que conseguí!!!
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
ViniGodoy
Mas… vamos falar a verdade… soluçãozinha tosca, né?
Achei a recomendação num site da sun…
L
Linkel
Rage:
Beleza kras, acho que conseguí!!!
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
Rage
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
cassio
Linkel:
Rage:
Beleza kras, acho que conseguí!!!
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
ViniGodoy
Realmente, o SELECT COUNT pode ficar mais elegante, mas duplica o acesso ao banco.
J
jgbt
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
giulianocosta
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.