..error in your SQL syntax

21 respostas
C

Pessoal,
Alguém poderia me dizer onde está o erro nessa consulta?
POis está retornando o erro abaixo:

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 '?' at line 1
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:3277)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:3206)
        at com.mysql.jdbc.Statement.executeQuery(Statement.java:1232)
        at dao.mysql.campanhaDaoMysql.listarTodasCampanhas(campanhaDaoMysql.java:44)
        at Controlador.Servlet.processRequest(Servlet.java:43)
        at Controlador.Servlet.doPost(Servlet.java:80)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:662)

Consulta:

public List<campanha> listarTodasCampanhas(String modelo) {
       try {
            conn = (Connection) ConnectionFactory.getConnection();
            String sql = "select * from listaCampanha where modelo like?";

            PreparedStatement stmt = conn.prepareStatement(sql);
           stmt.setString(1, modelo);
            //stmt.setString(2, modelo);

            ResultSet rs = stmt.executeQuery(sql);
            List<campanha> lista = new ArrayList();

            while (rs.next()) {
                campanha c = new campanha();
                c.setId(rs.getInt(1));
                c.setConcessao(rs.getString(2));
                c.setModelo(rs.getString(3));
                c.setItem(rs.getString(4));
                c.setCodigo(rs.getString(5));
                c.setPreco(rs.getString(6));
                c.setMo(rs.getString(7));
                lista.add(c);
            }
            rs.close();
            return lista;
        } catch (Exception ex) {
            Logger.getLogger(campanhaDaoMysql.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;

    }

21 Respostas

S

O erro está aqui:

String sql = "select * from listaCampanha where modelo like?";

tente algo assim

String sql = "select * from listaCampanha where modelo like 'teste'";
C

Sevalle:
O erro está aqui:

String sql = "select * from listaCampanha where modelo like?";

tente algo assim

String sql = "select * from listaCampanha where modelo like 'teste'";

Dessa forma funcinou porém preciso passar 2 variáveil nessa consulta, normalmente não se usa o sinal ‘?’ pra isso?

nel

CaioNascimento:
Sevalle:
O erro está aqui:

String sql = "select * from listaCampanha where modelo like?";

tente algo assim

String sql = "select * from listaCampanha where modelo like 'teste'";

Dessa forma funcinou porém preciso passar 2 variáveil nessa consulta, normalmente não se usa o sinal ‘?’ pra isso?

Sim, se usa.
Problema é que tu “grudou” o ‘?’ no LIKE, percebes?

S

Que eu saiba não.

Depende de como você quer fazer o select, mas pode ser algo assim:

SELECT * FROM tabela WHERE coluna1 LIKE 'teste' OR coluna1 LIKE '12345'
C

nel,

Corrigi o o sql e continua com o mesmo erro anterior:

..
String sql = "select * from listaCampanha where modelo like ?";

            PreparedStatement stmt = conn.prepareStatement(sql);
            stmt.setString(1, modelo);
L

Achei estranho da esse erro pra vc depois que colocou espaço entre o 'LIKE' e o '?'. Olha um teste que fiz e não deu erro:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import junit.framework.TestCase;

public class DBTest extends TestCase {

	public void test1() throws Exception {
		// new Driver();
		Connection c = DriverManager.getConnection("jdbc:mysql://localhost/ccc", "root", "root");
		PreparedStatement stmt = c.prepareStatement("SELECT * FROM tb_usuario WHERE NOM_USUARIO LIKE ?");
		stmt.setString(1, "%Adm%");
		ResultSet rs = stmt.executeQuery();
		while (rs.next()) {
			System.out.println(rs.getString("NOM_USUARIO"));
		}
		rs.close();
		stmt.close();
		c.close();
	}
}

O erro que ocorre continua o mesmo?(reclamando do '?')

C

È estranho mesmo o erro persiste:

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 '?' at line 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723) at com.mysql.jdbc.Connection.execSQL(Connection.java:3277) at com.mysql.jdbc.Connection.execSQL(Connection.java:3206) at com.mysql.jdbc.Statement.executeQuery(Statement.java:1232) at dao.mysql.campanhaDaoMysql.listarTodasCampanhas(campanhaDaoMysql.java:44) at Controlador.Servlet.processRequest(Servlet.java:43) at Controlador.Servlet.doPost(Servlet.java:80) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:662)

mauricioadl

use assim: like ‘?’

C

Dessa forma retornou o erro abaixo:

28/11/2011 09:58:07 dao.mysql.campanhaDaoMysql listarTodasCampanhas
GRAVE: null
java.sql.SQLException: Parameter index out of range (1 &gt; number of parameters, which is 0).
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
        at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:2796)
        at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:3627)
        at dao.mysql.campanhaDaoMysql.listarTodasCampanhas(campanhaDaoMysql.java:41)
        at Controlador.Servlet.processRequest(Servlet.java:43)
        at Controlador.Servlet.doPost(Servlet.java:80)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:662)
mauricioadl

tenta algo assim:

String sql = "select * from produtos where DESCRICAO like " + “’%Mini%’”

e tira o setString.

o engracado que testei aqui no oracle e tudo ele aceita like junto com ?, like com ‘’ sem ‘’. ele aceita tudo.

parece que o mysql eh mais enjoado.

[]´s

C

A unica forma que funcionou foi assim:

String sql = “select * from tabela where campo like " +”’"+variável+"’";

gambis total.

nel

Oi.

Veja:

String sql = "select * from listaCampanha where modelo like '%?%'";

Desculpe, creio que precise das aspas simples (’ ') para funcionar.
Acredito que funcione perfeitamente.

C

28/11/2011 09:58:07 dao.mysql.campanhaDaoMysql listarTodasCampanhas GRAVE: null java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

nel

Teste da forma como menciono em post anterior.

A

Acredito que com o select no formato abaixo deve funcionar:

String sql = "select * from listaCampanha where modelo like ?";  //apenas coloca o espaço no like

Agora, acho que o outro problema está no resto do seu código, neste trecho:

PreparedStatement stmt = conn.prepareStatement(sql);  
           stmt.setString(1, modelo);  
            //stmt.setString(2, modelo);  
  
            ResultSet rs = stmt.executeQuery(sql);  
            List&lt;campanha&gt; lista = new ArrayList();

Repare que está usando o método executeQuery passando a variável sql novamente como parâmetro.

Utilize a versão sem parâmetros stmt.executeQuery()

mauricioadl
PreparedStatement stmt = conn.prepareStatement(sql);  
           stmt.setString(1, modelo);  
             ResultSet rs = stmt.executeQuery(sql);  // AQUI ESTA O ERRO REMOVA O PARAMETRO sql
             List&lt;campanha&gt; lista = new ArrayList();
mauricioadl

xD o amigo ae de cima ja matou a charada antes.

[]´s

nel

Oi.

Se testou assim:

String sql = "select * from listaCampanha where modelo like '%?%'";

E existe algum erro ainda, creio que o problema seja questão de caracter de escape.
Provavelmente terás de usar um caracter de escape para conseguir inserir isso da forma correta.

Abraços.

C
nel:
Teste da forma como menciono em post anterior.

Fiz isso, deu o erro que mencionei

String sql = "select * from listaCampanha where modelo like"+"'%?%'";  
  
            PreparedStatement stmt = conn.prepareStatement(sql);  
            stmt.setString(1, modelo);
mauricioadl

faça como o AbelBueno disse que ira resolver e ficar de forma correta.

nao esqueca de por resolvido no topico.

[]´s

C

AbelBueno:
Acredito que com o select no formato abaixo deve funcionar:

String sql = "select * from listaCampanha where modelo like ?";  //apenas coloca o espaço no like

Agora, acho que o outro problema está no resto do seu código, neste trecho:

PreparedStatement stmt = conn.prepareStatement(sql);  
           stmt.setString(1, modelo);  
            //stmt.setString(2, modelo);  
  
            ResultSet rs = stmt.executeQuery(sql);  
            List&lt;campanha&gt; lista = new ArrayList();

Repare que está usando o método executeQuery passando a variável sql novamente como parâmetro.

Utilize a versão sem parâmetros stmt.executeQuery()

Isso ae deu certo|!

Valeu

Criado 28 de novembro de 2011
Ultima resposta 28 de nov. de 2011
Respostas 21
Participantes 6