Erro na sintaxe do SQL

15 respostas
M

Pessoal,

Não estou conseguindo ver que erro de sintaxe está correndo nesta query :

String sqlDados = "SELECT P.PES_RG, P.PES_CPF FROM PESSOAS P WHERE P.PES_RG = ? AND P.PES_CPF = ? AND P.PES_COD_PESSOA="+codigoPessoa;

Está aparecendo a seguinte mensagem :

SELECT P.PES_RG, P.PES_CPF FROM PESSOAS P WHERE P.PES_RG = ? AND P.PES_CPF = ? AND P.PES_COD_PESSOA=6831
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘? AND P.PES_CPF = ? AND P.PES_COD_PESSOA=6831’ at line 1

Alguém poderia me ajudar ?
Atgradece,

Max

15 Respostas

M

Você ta usando PreparedStatement?
Acho que fica mais fácil se postar o método todo :slight_smile:

M

Sim, exatamente isto.

M

tem como postar o método?

E se tá usando PreparedStatement pq ta concatenando uma variável diretamente na string sql?

skalinichenko

tem como postar o método?

E se tá usando PreparedStatement pq ta concatenando uma variável diretamente na string sql?

  • 1!
M

Estou usando assim agora,

String sqlDados = “SELECT P.PES_RG, P.PES_CPF FROM PESSOAS P WHERE P.PES_RG = ? AND P.PES_CPF = ? AND P.PES_COD_PESSOA = ?”;

Mas o problema ainda persite.
[]'s
Max

M

Posta o método pra gente tentar ajudar :slight_smile:

Vini_Fernandes

Uma dica para maxcarvalho : sempre que o erro de sintaxe persiste eu executo a instrição SQL na base de dados para me garantir que meu codigo esta correto! Creio que essa seja a hora de voce fazer isso!

Ate mais

M

Não estou sabendo testar a query na base de dados MySQL, pois não sei o que seria o equivalente em nível de banco de dados às ‘?’ que se utiliza para receber parâmetros no ambiente JDBC.

Continuo sem entender o que está acontecendo…

[]'s
Max

Vini_Fernandes

Cara, voce tem que colocar um valor ficticio no lugar de “?”, por exemplo, suponha que vc tenha a seguinte query:

SELECT U.NOME, U.IDADE, U.DATAINSCRICAO FROM USUARIO AS U WHERE U.IDADE = ? AND U.DATAINSCRICAO = ? ;

agora substituindo:

SELECT U.NOME, U.IDADE, U.DATAINSCRICAO FROM USUARIO AS U WHERE U.IDADE = 24 AND U.DATAINSCRICAO = '2009-02-01';

Espero ter ajudado

M

Segue o código da classe "quase toda".

Olhei o código e, pelo menos aparentemente, está tudo normal, senão vejamos :

public class QueryPessoa {
...
public boolean validaDados(String minhaMatricula, String umRg, String umCpf) {

PreparedStatement pstmtDados;
ResultSet rsDados;
String meuRg;
String meuCpf;
int codigoPessoa;
....
codigoPessoa = buscaPessoa(minhaMatricula); /* codigoPessoa é instanciado a partir da chamada a um outro método da mesma classe não mostrada aqui */
        
if (codigoPessoa != 0 ) {
sqlDados = "SELECT P.PES_RG, P.PES_CPF FROM PESSOAS P WHERE P.PES_RG = ? AND P.PES_CPF = ? AND P.PES_COD_PESSOA = ?";
...
try {
...
pstmtDados = conn.prepareStatement(sqlDados);
pstmtDados.setString(1,umRg);
pstmtDados.setString(2,umCpf);
pstmtDados.setInt(3,codigoPessoa);
rsDados = pstmtDados.executeQuery(sqlDados); /* erro é aqui */
...
rsDados.next();
meuRg = rsDados.getString("P.PES_RG");
meuCpf = rsDados.getString("P.PES_CPF");
...
if ( (meuRg.equals(umRg)) && (meuCpf.equals(umCpf)) ) {
		    	
   System.out.println("Dados validados com sucesso !!!"); 
   return true;
}
else {
		    
       System.out.println("Dados não conferem !!!");
       return false;
}

} catch (SQLException sqle) {

System.ouyt.println("Problema na execução do SQL");
sqle.printStackTrace();
return false;

}

}

}
Vini_Fernandes

Bom cara, acho que o problema esta resolvido! Veja o que tem que ser feito:

a linha que vc tem eh essa abaixo

rsDados = pstmtDados.executeQuery(sqlDados);

mas voce deveria ter

rsDados = pstmtDados.executeQuery();

Cara, nao sei como voce nao teve uma excecao em tempo de compilaçao!!

Ate mais

M

Vini,

Procedi a modificação por você sugerida, mas ainda não obtive êxito.
A semana que vem vou testar esta classe acessando uma base Oracle.
Tomara que dê certo. Depois vejo como fazer em MySQL.
Agradece,

Max Carvalho

M

Resolvi postar a versão mais completa e atualizada da classe QueryPessoa e da classe TestaQueryPessoa.

Classe QueryPessoa

package persistence;

import java.sql.*;

import javax.swing.JOptionPane;

public class QueryPessoa {
	
    private  String driver = "com.mysql.jdbc.Driver";
    private  String url = "jdbc:mysql://127.0.0.1:3306/posgrad";
    private  String username = "root";
    private  String password = "ufpb"; 
    private  Connection conn;
    
    public QueryPessoa() {
    	
    	conn = obtemConexao();
    }
    
    public Connection obtemConexao() {
        
        try { 
        
            Class.forName(driver);
            JOptionPane.showMessageDialog(null, "Criando intância de conexão");
            conn = DriverManager.getConnection(url,username,password );
            JOptionPane.showMessageDialog(null, "Instância obtida : <" + conn +">"); 
           
            return conn;
           
        } catch (ClassNotFoundException cnfex) {
           
            System.err.println("Falha ao carregar o driver JDBC.");
            cnfex.printStackTrace();
            conn = null;
            return conn;
     
        }   catch (SQLException sqlex) {
           
           System.err.println( "Impossivel conectar" );
           sqlex.printStackTrace();
           conn = null;
           return conn;
           
       }
        
     } 
	
    public int buscaPessoa(String umaMatricula) {
		
		PreparedStatement stmt;
		ResultSet rs;
		int codigo;
		
		try{
			
			String sql = "SELECT A.ALU_PES_COD_PESSOA FROM ALUNOS A WHERE A.ALU_MATRICULA=?";
			stmt = conn.prepareStatement(sql);
			if (stmt == null) {
				
				System.out.println("Comando nulo");
			}
			else {
				
				System.out.println("Comando não nulo");
			}
			stmt.setString(1,umaMatricula);
			rs = stmt.executeQuery();
			if (rs == null) {
				
			   System.out.println("Resultset nulo");
			   
			}
			else {
				
				System.out.println("Resultset não nulo");
			}
			rs.next();
			
			codigo = rs.getInt("ALU_PES_COD_PESSOA");
			
			System.out.println("Código da Pessoa : " + codigo);
			return codigo;
		}			
		catch (Exception ex) {			
			System.out.println(ex.getMessage());
			System.out.println("Lancei exceção");
			ex.printStackTrace();
			return 0;
		}	
	
	}
			
	public boolean validaDados(String minhaMatricula, String umRg, String umCpf) {
		
		PreparedStatement pstmtDados;
		ResultSet rsDados;
		ResultSetMetaData rsMetaData;
		String meuRg;
		String meuCpf;
		int codigoPessoa;
		int numColunas;
		
                codigoPessoa = buscaPessoa(minhaMatricula);
        
                if (codigoPessoa != 0 ) {
        	
		    String sqlDados = "SELECT P.PES_RG, P.PES_CPF FROM PESSOAS P WHERE P.PES_RG = ? AND P.PES_CPF = ? AND P.PES_COD_PESSOA = ?";
		    System.out.println(sqlDados);
		
		    try {
			
		        pstmtDados = conn.prepareStatement(sqlDados);
		        pstmtDados.setString(1,umRg);
		        pstmtDados.setString(2,umCpf);
		        pstmtDados.setInt(3,codigoPessoa);
		        rsDados = pstmtDados.executeQuery();
		        
		        rsMetaData = rsDados.getMetaData();
		        numColunas = rsMetaData.getColumnCount();
		        
		        for (int i = 1; i <= numColunas; i++) {
		        
		        	String columnName = rsMetaData.getColumnName(i);
		        	System.out.println(columnName);
		        	
		        }
		        
		        if (rsDados == null) {
		        	System.out.println("Resultset nulo");
		        } else {
		        	System.out.println("Resultset não-nulo");
		        }
		        rsDados.next();
		        meuRg = rsDados.getString(1);
		        System.out.print("RG : " + meuRg);
		        meuCpf = rsDados.getString(2);
		    
		        if ( (meuRg.equals(umRg)) && (meuCpf.equals(umCpf)) ) {
		    	
		    	     System.out.println("Dados do aluno válidos. Recuperação efetuada com sucesso");
                             return true;
		        }
		        else {
		    
		           System.out.println("Dados não conferem. Impossível recuperar.");
		           return false;
		        }
		    
		    } catch (SQLException sqle) {
			
			   sqle.printStackTrace();
			   return false;
			
		    }
		
	    } else {
	    	
	    	System.out.println("Aluno não encontrado !!!");
	    	return false;
	    }
	
        
    }
	
}
M

Classe TestaPessoa

package beans;

import persistence.QueryPessoa;

public class TestaPessoa {

	public static void main(String[] args) {
		
            QueryPessoa minhaPessoa = new QueryPessoa(); 
		
	     if ( minhaPessoa.validaDados("308100011", "1338460", "[telefone removido]") == true) {
			
			System.out.println("Recuperação Autorizada");
	     }
	     else {
			 
			System.out.println("Impossível Recuperar Senha");
             }
		

	}

}
M

Atualmente o erro que está aparecendo na seguinte linha:

...
meuRg = rsDados.getString(1);
...

da classe QueryPessoa. Segue, abaixo, o conteúdo do “Console” do Eclipese, logo que o erro acontece :

Matricula : 308100011
SQL : SELECT A.ALU_PES_COD_PESSOA FROM ALUNOS A WHERE A.ALU_MATRICULA=?
Comando não nulo
Resultset não nulo
Código da Pessoa : 6831
SELECT P.PES_RG, P.PES_CPF FROM PESSOAS P WHERE P.PES_RG = ? AND P.PES_CPF = ? AND P.PES_COD_PESSOA = ?
PES_RG
PES_CPF
Resultset não-nulo
java.sql.SQLException: Illegal operation on empty result set.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
at com.mysql.jdbc.ResultSet.checkRowPos(ResultSet.java:685)
at com.mysql.jdbc.ResultSet.getNativeString(ResultSet.java:4341)
at com.mysql.jdbc.ResultSet.getStringInternal(ResultSet.java:5633)
Impossível Recuperar Senha
at com.mysql.jdbc.ResultSet.getString(ResultSet.java:5431)
at persistence.QueryPessoa.validaDados(QueryPessoa.java:161)
at beans.TestaPessoa.main(TestaPessoa.java:36)

Como “java.sql.SQLException: Illegal operation on empty result set.” ?

Se fiz um if que me retornou que o ResultSet é não nulo ?

Agradece,

Max

Criado 27 de maio de 2009
Ultima resposta 30 de mai. de 2009
Respostas 15
Participantes 4