Tem como se eu fizer um select no banco Oracle saber no Java se ele não retornou nada?
Vc está utilizando um ResultSet na sua classe ?
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
}
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.
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
}
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?
Usa o beforeFirst();
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?
Como esta o seu select ?
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);
}
[code]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);
}[/code]
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
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
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??