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

Pessoal,

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

[code]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[/code]

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

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 !!!

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

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();

ta faltando:

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

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

[code]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;
}

}[/code]

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

[code]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";
}

}[/code]

Meu jsp====

[code]<%@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”%>

JSP Page
        <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>
[/code]

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.

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();  

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

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:

[code] 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();[/code]

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!!

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