ORA-01008 not all variables bound (nem todas as variáveis são limitadas)

9 respostas
P

Pessoal,

Estou com esse erro na hora de executar um INSERT no código java:

try{
        String sql = "SELECT campo1, campo2, campo3           
        " FROM tabela1";
            	
        PreparedStatement pstmt = DataBase.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
            	
        while (rs.next()){
            sql = "INSERT INTO tabela2 " +
            " (campo1, campo2, campo3) " +			
            " VALUES " +
            " (?, ?, ?)";					
				
            PreparedStatement pstmt = DataBase.prepareStatement(sql);
					
            pstmt.setInt(1, rs.getInt(1));		  
            pstmt.setInt(2, rs.getInt(2));
            pstmt.setInt(3, rs.getInt(3));
              
            System.out.println(rs.getInt(1));
            System.out.println(rs.getInt(2));
            System.out.println(rs.getInt(3));
					
            DataBase.executeUpdate(sql); // ERRO AKI !
        }
}catch(SQLException e){
        System.out.println(e.getMessage());
} // try

Ao executar o INSERT me da o seguinte erro:
ORA-01008 nem todas as variáveis são limitadas

Estou usando o Eclipse, o banco eh um Oracle10g e minha JVM esta na versão 1.4.2

Alguém, ja se deparou com esse erro ??

O engraçado, eh que eu tento fazer o insert direto no banco, usando o sqlplus, e funciona numa boa... =[

Padre

9 Respostas

P

kraca…

Como eu adoro esse fórum… ele possui uma energia positiva incrível… 8)

Soh de posta aki, revi com mais calma meu código e achei o problema…

O erro esta na linha:

DataBase.executeUpdate(sql);

Pq fazendo isso, eu estou pedindo para ele executar o SQL, mas ai, ele ta sem a definição do que seria cada “?”, pois estou jogando direto a variável…

O correto eh:

pstmt.executeUpdate();

Desta forma ele executa o mesmo sql, porém, com a definição de cada “?” que foi feita anteriormente…

Ou seja…

.Declarar a variável sql (INSERT);

.Define o que será cada “?” pelo PreparedStatement;

.Executar a query pelo PreparedStatement;

Vlw galera !!!

R

Po broder estou com esse mesmo problema porém fazendo um update olha só

public void updateCliente(ClienteTO clienteTO) throws Exception {

		
		String sql = "update cadcliente set CODIGOCLI=?, NOME=?, ENDERECO=?, RG=?, CPF=?, TELFIXO=?, ";
		sql = sql
				.concat("CEL=?, BAIRRO=?, DATANASCIMENTO=?, NUMERO=?, COMPLEMENTO=?, EMAIL =? where CODIGOCLI =?");
		
		try { 
			PreparedStatement pstm = getConnection().prepareStatement(sql);
			pstm.setString(1, clienteTO.getCodigocli());
			pstm.setString(2, clienteTO.getNome());
			pstm.setString(3, clienteTO.getEndereco());
			pstm.setString(4, clienteTO.getRg());
			pstm.setString(5, clienteTO.getCpf());
			pstm.setString(6, clienteTO.getTelfixo());
			pstm.setString(7, clienteTO.getCel());
			pstm.setString(8, clienteTO.getBairro());
			pstm.setDate(9, clienteTO.getDataNascimentoDate());
			pstm.setString(10, clienteTO.getNumero());
			pstm.setString(11, clienteTO.getComplemento());
			pstm.setString(12, clienteTO.getEmail());
			pstm.executeUpdate();
			pstm.close();
			
		} catch (Exception ex) {
			System.out.println("Erro: " + ex);
			System.err.println("Erro: " + ex);
			throw new Exception(ex);

		}

se alguém poder ajudar

O

Você tem 13 parâmetros:

String sql = "update cadcliente set CODIGOCLI=?, NOME=?, ENDERECO=?, RG=?, CPF=?, TELFIXO=?, ";
		sql = sql.concat("CEL=?, BAIRRO=?, DATANASCIMENTO=?, NUMERO=?, COMPLEMENTO=?, EMAIL =? where CODIGOCLI =?");

mas só passou 12:

PreparedStatement pstm = getConnection().prepareStatement(sql);
			pstm.setString(1, clienteTO.getCodigocli());
			pstm.setString(2, clienteTO.getNome());
			pstm.setString(3, clienteTO.getEndereco());
			pstm.setString(4, clienteTO.getRg());
			pstm.setString(5, clienteTO.getCpf());
			pstm.setString(6, clienteTO.getTelfixo());
			pstm.setString(7, clienteTO.getCel());
			pstm.setString(8, clienteTO.getBairro());
			pstm.setDate(9, clienteTO.getDataNascimentoDate());
			pstm.setString(10, clienteTO.getNumero());
			pstm.setString(11, clienteTO.getComplemento());
			pstm.setString(12, clienteTO.getEmail());
			pstm.executeUpdate();
			pstm.close();
L

ta faltando:

pstm.setString(13, clienteTO.getCodigocli());
K

Estou com um problema parecido com esse seu. Estou fazendo um sistema de Login. Olha só como está meu código:
Meu LoginDAO===========

package br.com.caelum.fj26.dao;

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


public class LoginDAO {

	public LoginDAO() {
	}

	public boolean Login(String usuario, String password) {
		boolean ok = false;

		try {
			Class.forName("org.postgresql.Driver").newInstance();
		} catch (Exception e) {
			System.out.println("driver nao carregado");
		}

		try {
			String sql = "SELECT * from Usuario where usuario=?, password=?";

			Connection c = DriverManager.getConnection(
					"jdbc:postgresql://localhost:5432/teste", "postgres",
					"postgres");


			PreparedStatement pstm = c.prepareStatement(sql);
			ResultSet rs = pstm.executeQuery();
			pstm.setString(1, usuario);
			pstm.setString(2, password);
			if (!rs.getString("usuario").equals(null)) {
				if (rs.getString("usuario").equals(usuario)) {
					if (rs.getString("password").equals(password)) {
						ok = true;
					}
				} else {
					ok = false;
				}
			}
		} catch (SQLException ex) {
			ex.printStackTrace();
		}
		return ok;
	}

}

Meu LoginHandler===========

package br.com.caelum.fj26;

import br.com.caelum.fj26.dao.LoginDAO;
import br.com.caelum.fj26.modelo.Login;

public class LoginHandler {

	private LoginDAO loginDAO = new LoginDAO();

	public LoginHandler() {

	}

	private Login LO = new Login();

	public Login getLO() {
		return LO;
	}

	public void setLO(Login LO) {
		this.LO = LO;
	}

	public String login() {
		System.out.println("usuario= " + LO.getUsuario());
		System.out.println("password= " + LO.getPassword());
		boolean ok = loginDAO.Login(LO.getUsuario(), LO.getPassword());
		if (ok == true) {
			return "ok";
		} else
			return "erro";
	}
}

Meu jsp====

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
    <f:view>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>JSP Page</title>
        </head>
        <body>
        <f:loadBundle basename="messages" var="msgs" />
        
            <h:form id="login_form">
                <h:panelGrid  columns="2" id="login_panel">
                    <f:facet name="header">
                        <h:outputText value="Login" />
                    </f:facet>
                    <f:facet name="footer">
                        <h:commandButton value="Logar" action="#{LoginHandler.login}"/>
                    </f:facet>
                    
                    <!--campo usuario-->
                    
                    <h:outputLabel for="usuario">
                        <h:outputText value="Usuario"/>
                    </h:outputLabel>
                    <h:inputText value="#{LoginHandler.LO.usuario}" id="usuario" />
                    
                    <!--campo senha-->
                    
                    <h:outputLabel for="password">
                        <h:outputText value="password"/>
                    </h:outputLabel>                    
                    <h:inputSecret value="#{LoginHandler.LO.password}" id="password" />
                </h:panelGrid>
            </h:form>       
        </body>
    </f:view>
</html>

O erro que aparece quando eu acesso o login.jsp é esse:

org.postgresql.util.PSQLException: Nenhum valor especificado para parâmetro 1.
	at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:174)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:246)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:367)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:271)
	at br.com.caelum.fj26.dao.LoginDAO.Login(LoginDAO.java:45)
	at br.com.caelum.fj26.LoginHandler.login(LoginHandler.java:42)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:131)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
	at javax.faces.component.UICommand.broadcast(UICommand.java:383)
	at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:186)
	at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:164)
	at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:352)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at br.com.caelum.fj26.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:20)
	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:175)
	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:263)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:636)

Alguem tem alguma dica do que pode estar errado?? Como eu sou novo no java, e nao tenho muito conhecimento de SQL (que é onde eu acho que está o meu erro...) fica dificil pra mim progredir sozinho....
Obrigado pela ajuda.

G

você colocou a carroça na frente dos bois!

PreparedStatement pstm = c.prepareStatement(sql);  
             ResultSet rs = pstm.executeQuery();  
             pstm.setString(1, usuario);  
             pstm.setString(2, password);

tente assim:

PreparedStatement pstm = c.prepareStatement(sql);  

             pstm.setString(1, usuario);  
             pstm.setString(2, password);  

             ResultSet rs = pstm.executeQuery();
A

Kleber,

Voce está executando a consulta antes de setar os parametros:

ResultSet rs = pstm.executeQuery();

pstm.setString(1, usuario);

pstm.setString(2, password);

correto:

pstm.setString(1, usuario);   
        pstm.setString(2, password);

ResultSet rs = pstm.executeQuery();

Abraco

K

Olá pessoal, td bem??
Consegui resolver o problema.

Além do que os colegas mencionou, faltou eu dar o next depois do resultset. ficou assim:

public boolean Login(String usuario, String password) {
		boolean ok = false;

		try {
			Class.forName("org.postgresql.Driver").newInstance();
			System.out.println("DRIVER CARREGADO");
		} catch (Exception e) {
			System.out.println("driver nao carregado");
		}

		try {
			String sql = "SELECT * from Usuario where usuario=? AND password=?";

			Connection c = DriverManager.getConnection(
					"jdbc:postgresql://localhost:5432/teste", "postgres",
					"postgres");
			PreparedStatement pstm = c.prepareStatement(sql);
			pstm.setString(1, usuario);
			pstm.setString(2, password);
			ResultSet rs = pstm.executeQuery();
			System.out.println("CONEXAO ESTABELECIDA");
			//olha o que faltou aqui:
                       rs.next();

Agradeço a todos pelas dicas. Agora o próximo passo é criar os níveis de acesso para usuario e administrador no login.

Abraços!!

A

Se atente tbm a utilizar o next() dentro de um if ou while.
Caso sua consulta não tenha retorno, irá dar erro!

Criado 21 de dezembro de 2006
Ultima resposta 21 de jul. de 2009
Respostas 9
Participantes 7