[RESOLVIDO] Como fazer o oracle entender que eu quero utilizar uma sequence?

Sou eu mais uma vez galera :lol:
É o seguinte:

Estou passando uma string sql no java com 4 parâmetros mas no campo id eu
quero utilizar uma sequence já que o oracle não tem o tipo auto incremental.

Como é que eu faço isso?

Minha classe DAO

package br.com.caelum.jdbc.dao;

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

import br.com.caelum.jdbc.ConnectionFactory;
import br.com.caelum.jdbc.modelo.Contato;

public class ContatoDAO {
	
	// a conexão com o banco
	private Connection connection;

	public ContatoDAO() throws SQLException {
		this.connection = ConnectionFactory.getConnection();
	}

	public void adiciona(Contato contato) throws SQLException {

		// prepared statement para inserção
		PreparedStatement pstm = this.connection
				.prepareStatement("INSERT INTO CONTATOS (ID, NOME, EMAIL, ENDERECO) VALUES (?,?,?,?)");

		// seta os valores
		pstm.setInt   (1, contato.getId());
		pstm.setString(2, contato.getNome());
		pstm.setString(3, contato.getEmail());
		pstm.setString(4, contato.getEndereco());

		// executa
		pstm.execute();
		pstm.close();

	}

}

Minha classe Contato (JavaBean)


package br.com.caelum.jdbc.modelo;

public class Contato {
	private int id;
	private String nome;
	private String email;
	private String endereco;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

}

e minha classe TestaInserção


package br.com.caelum.jdbc;

import java.sql.SQLException;

import javax.swing.JOptionPane;

import br.com.caelum.jdbc.dao.ContatoDAO;
import br.com.caelum.jdbc.modelo.Contato;

public class TestaInsere {

	/**
	 * @param args
	 * @throws SQLException
	 */
	public static void main(String[] args) throws SQLException {
		// TODO Auto-generated method stub

		
		String nome = JOptionPane.showInputDialog("NOME");
		String email = JOptionPane.showInputDialog("EMAIL");
		String endereco = JOptionPane.showInputDialog("ENDEREÇO");

		Contato contato = new Contato();

		contato.setId(1);
		contato.setNome(nome);
		contato.setEmail(email);
		contato.setEndereco(endereco);

		ContatoDAO dao = new ContatoDAO();

		dao.adiciona(contato);

		JOptionPane.showMessageDialog(null, "Registro Gravado com Sucesso!!!",
				"Confirmação", 1);

	}

}

vlw

INSERT INTO CONTATOS (ID, NOME, EMAIL, ENDERECO) VALUES (SEQUENCIA_MINHA.NEXTVAL,?,?,?)

Até!

Olá amigo!

(nomedasequence.nextval)
Deste jeito não funciona no java só funciona no sql do banco. No java o banco dá erro de nome de coluna inválido acho que é por que ele entende como string e não como um comando sql.

O PreparedStatement faz um parse, identificando valores válido, ele não simplesmente faz substituição.

Até!

Eu sou novato em java não tenho muito conhecimento
de como as classes trabalham internamente mas estou etudando.
O que preciso alterar no código para poder funcionar?
Obrigado

Precisas passar a sequence dinamicamente? Se estiver na string, vai executar (eu acho) normalmente.
Outra coisa que podes fazer é pegar a sequence através de um select e depois colocar no insert.

Até!

Tá difícil cara, de repente a solução é simples
mas tem coisas que a gente tem que quebrar a
cabeça mesmo por que é assim que se aprende.
É a segunda vez que tenho esse tipo de problema. Na
primeira além da sequence também tive o mesmo problema
ao passar uma data para um campo tipo DATE na tabela do BD. :cry:

Ou você faz como eu mostrei ou você executa:

SELECT MEU_SCHEMA.SEQUENCIA_MINHA.NEXTVAL FROM DUAL

Pega o valor e coloca no insert.

Até!

Desisto!!!

Eu queria chamar a sequence dinamicamente na aplicação mas a minha cabeça já ferveu. Sei que isso não é uma boa prática mas por enquanto vou inserir o código manualmente.

Obrigado pela força.

[code]

Statement stmtSequence = con.createStatement();
String sqlPegaSequence = “SELECT MEU_SCHEMA.” + nomeDaSequence + “.NEXTVAL FROM DUAL”;
ResultSet rsSequence = stmtSequence.executeQuery(sqlPegaSequence);
if(rsSequence.next()){
// prepared statement para inserção
PreparedStatement pstm = this.connection
.prepareStatement(“INSERT INTO CONTATOS (ID, NOME, EMAIL, ENDERECO) VALUES (?,?,?,?)”);

	// seta os valores
	pstm.setInt   (1, rsSequence.getInt(1));
	pstm.setString(2, contato.getNome());
	pstm.setString(3, contato.getEmail());
	pstm.setString(4, contato.getEndereco());

…[/code]
:?

vai no seu banco de dados da oracle e cria a sua sequence

CREATE SEQUENCE guj_id START WITH 1000 INCREMENT BY 1
e no insert vc poe ela assim

INSERT INTO tabela(id, nome, sobrenome) VALUES(guj_id.NEXTVAL, 'Lucas', 'Souza');
cara, comigo isso nunca falhou, eu estava usando isso ateh meu ODBC do oracle trava
e sempre deu certo

meu código era esse, eh um pouco diferente do seu

st.executeUpdate("INSERT INTO agenda(ag_id, nome, sobrenome, tel_com, tel_hom, ender) "+ "VALUES(ag_seq.NEXTVAL,'?', '?', '?','?','?')");

Outro modo: “Transformar” sua coluna ID em auto-increment através de uma Trigger. Você consegue achar o código dessa trigger com facilidade na internet.

E depois…

insert into TB_PESSOAS (NOME, SOBRENOME) values ('Joao', 'Silva')

Galera, valeu pela força.Depois de tanto esquentar a cabeça consegui resolver.

na minha classe de teste eu criei uma conexão para executar o select que pega o próximo valor da trigger e depois eu chamei o método setId() e passei pra ele o valor retornado pelo método getId(). Belezinha.
Ficou meio nebuloso mas está funcionando direitinho.
Vou ver se melhoro o código depois.

Assim ficou a classe: Vide comentários

package br.com.caelum.jdbc;

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

import javax.swing.JOptionPane;

import br.com.caelum.jdbc.dao.ContatoDAO;
import br.com.caelum.jdbc.modelo.Contato;

public class TestaInsere {

	/**
	 * @param args
	 * @throws SQLException
	 */
	public static void main(String[] args) throws SQLException {
		// TODO Auto-generated method stub
		//faz a conexão para pegar o próximo valor da sequence
		Connection connection;
		connection = ConnectionFactory.getConnection();
		PreparedStatement pstm2 = connection
				.prepareStatement("select sec_contatos.nextval from dual");

		Contato contato = new Contato();

		ResultSet res = pstm2.executeQuery();
		
		//pega o valor recuperado pela query e seta ele através do método setId() 
		while (res.next()) {
			contato.setId(res.getString(1));
		}

		res.close();
		pstm2.close();
		connection.close();

		String nome = JOptionPane.showInputDialog("NOME");
		String email = JOptionPane.showInputDialog("EMAIL");
		String endereco = JOptionPane.showInputDialog("ENDEREÇO");
		
		//seta o restante das variáveis da classe recuperadas com swing
		contato.setNome(nome);
		contato.setEmail(email);
		contato.setEndereco(endereco);

		ContatoDAO dao = new ContatoDAO();
		
		//chama o método adiciona do objeto dao e passa o objeto do tipo Contatos para o método adiciona
		dao.adiciona(contato);
		
		System.out.println(contato.getId());

		JOptionPane.showMessageDialog(null, "Registro Gravado com Sucesso!!!",
				"Confirmação", 1);

	}

}

Um grande abraço a todos e um bom fim de semana tb