Saber se select não retornou nada

13 respostas
P

Tem como se eu fizer um select no banco Oracle saber no Java se ele não retornou nada?

13 Respostas

V

Vc está utilizando um ResultSet na sua classe ?

brunogamacatao

Supondo que você obtem o resultado do seu select em um ResultSet você pode fazer o seguinte:

ResultSet rs = statement.executeQuery(SQL_QUERY);
if (!rs.next()) {
    System.err.println("Não há registros");
} else {
    //Processa os registros
}
B

if (! rs.next()) { . . .}

Se não for possível fazer um next na primeira tentativa seu resultset estará vazio.

Mas cuidado ao utilizar este código se vc pretende fazer um loop no resultset logo após o if. É que se houver registros o next() invocado no if moverá o “ponteiro” para o primeiro elemento existente, e o while/for moveria para o segundo.

K

Tem sim.

//Faz sua consilta no Banco de Dados
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");

if (rs.next() ){
  //Se entrar aqui retornou alguma coisa
}
else{
 //Se entrar aqui não retornou nada
}
P

Pessoal tentei usar as dicas de vcs mas esbarrei em um problema, sempre o meu select resultará em apenas 1 linha.
No teste if o meu pontei irá automaticamente mover para a próxima. Então eu tentei retornar para o primeiro ponteiro usando first() mas dessa forma me retorna um SQLException.
Olha o meu código:

ResultSet rsSelect1 = conexao2.stm.executeQuery();
            if(!rsSelect1.next()){
                JOptionPane.showMessageDialog(null,
                    "Item desativado, consulte novamente.",
                    "Aviso!",
                    JOptionPane.WARNING_MESSAGE);
            }else{ 
                rsSelect1.first();
                try{
                Thread.sleep(200);
                }catch(InterruptedException ie){
                    JOptionPane.showMessageDialog(null,
                        "Erro na Thread MAIN. Código: " + ie,
                        "Erro!",
                        JOptionPane.ERROR_MESSAGE);
                }
                while(rsSelect1.next()){
                    jTextFieldCodigoProduto2.setText(rsSelect1.getString("COD_MAT"));
                    jTextFieldDescProduto.setText(rsSelect1.getString("DESC_MAT"));
                    jTextFieldDescCompleta.setText(rsSelect1.getString("DESC_MAT_COMPLE"));
                }
            }

Não dá para usar o fist() nessa situação?

V

Usa o beforeFirst();

P

Usei o beforefirs() e está dando o seguinte erro:

SQLException: Operação inválida para encaminhar apenas
conjunto de caracteres: beforeFirst

Será que é porque tenho apenas uma linha como retorno?

V

Como esta o seu select ?

P

O meu select é esse:

conexao2.setSelect("select cod_mat, desc_mat, desc_mat_comple " +
                "from bebwilson.cad_matpri "+
                "where desativado is null " +
                    "and cod_mat = " + jTextFieldCodigoProduto.getText());
        conexao2.abrirbanco();

Não sei se é prático isso, mas nesse exato momento eu consegui resolver dessa forma:

try{
            ResultSet rsSelect1 = conexao2.stm.executeQuery();
                      
            if(!rsSelect1.next()){
                JOptionPane.showMessageDialog(null,
                    "Item desativado, consulte novamente.",
                    "Aviso!",
                    JOptionPane.WARNING_MESSAGE);
            }else{
                conexao2.abrirbanco();
                ResultSet rsSelect3 = conexao2.stm.executeQuery(); 
                while(rsSelect3.next()){
                    jTextFieldCodigoProduto2.setText(rsSelect1.getString("COD_MAT"));
                    jTextFieldDescProduto.setText(rsSelect1.getString("DESC_MAT"));
                    jTextFieldDescCompleta.setText(rsSelect1.getString("DESC_MAT_COMPLE"));
                }
            }
            
         }catch(SQLException sqle){
            JOptionPane.showMessageDialog(null,
                    "Impossível conectar com o Banco de Dados! Código: " + sqle.toString(),
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
        }
J
ResultSet rsSelect1 = conexao2.stm.executeQuery();
boolean existe = false;

while (rsSelect1.next()) {
  existe = true;
  jTextFieldCodigoProduto2.setText(rsSelect1.getString("COD_MAT"));
  jTextFieldDescProduto.setText(rsSelect1.getString("DESC_MAT"));
  jTextFieldDescCompleta.setText(rsSelect1.getString("DESC_MAT_COMPLE"));
}

if (!existe) {
 JOptionPane.showMessageDialog(null,
 "Item desativado, consulte novamente.",
 "Aviso!",
 JOptionPane.WARNING_MESSAGE);
}
fredferrao

Para navegar pelo ResultSet é preciso avisa-lo, pois o default é forward only, vela o que eu escrevi aqui: http://www.guj.com.br/posts/list/35148.java

dudaskank

caso não queira mudar o padrão do ResultSet, faça como disse o julianostr, ou substitua o seu while() por um do {} while()

flw

A

Senhores,

if(rs.next()){
 // faz o que tem que fazer, já que rs.next() manda justamente para o primeiro registro
}
else{
  System.out.println("Não veio nada!!");
}

Certo??

Criado 13 de julho de 2006
Ultima resposta 14 de jul. de 2006
Respostas 13
Participantes 9