[RESOLVIDO]Inserir dados no oracle e ter o retorno da PK

5 respostas
lazaropj

Bom dia Pessoal…

estou inserindo um registro no banco e gostaria que retornasse o id gerado pelo mesmo.
estou utilizando PreparedStatement e meu banco é o Oracle 10g.

Abraço !!!

5 Respostas

romarcio

Depois do insert vc poderia fazer um select max(id) from tabela.

Ou então, como vc tem os dados do insert, montar um Select com esses dados para pegar o ID da coluna.

Se vc usa-se hibernate, logo após o insert, já teria no objeto o ID, mas com PreparedStatement acho que seria de uma das formas que citei acima.

SilverFangs

Fala Lazaro, acho que a forma que voce vai ter que resolver isso é sua tabela não sendo auto enumeration. ai voce vai fazer uma consulta antes de inserir o dado para definir a chave que ele estará usando, ainda assim, voce correrá o risco de ter erro pois com a PK sem ser autoenumeration, voce poderia estar inserindo dados com outra pessoa e pegar o mesmo dado que ela, pode ser que tenha como voce fazer isso via query, retornar o valor do insert num Resultset, e quando executar a query jogar o result nesse resultset, e buscar o campo. mas eu não sei como faria essa query especificamente.

lazaropj

eu tbm não consigo desenvolver a query...

ja tentei fazer dessa forma :

// teste 1
String query = "BEGIN insert into "+executa.usuarioDB+"obj_especiais(DESC_OBJ_ESPECIAL) values(?) returning cod_obj_especial into ?; END;  ";

    
		try {
	 		OracleCallableStatement ocs;
			ocs = (OracleCallableStatement) con.prepareCall(query);
			ocs.registerOutParameter(1, OracleTypes.NUMBER);
			ocs.execute();
			System.out.println("o codigo inserido é esse ==>" + ocs.getInt(1));
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

... insere no banco mas na hora de imprimir na tela, não aparece nada.

tambem tentei utilizando dois sqls, um para inserir e outro para retornar, mas o retorno é null

// teste 2

String sql = "insert into "+executa.usuarioDB+"obj_especiais(DESC_OBJ_ESPECIAL) values(?);";
String sql2 = "select * from "+executa.usuarioDB+"obj_especiais where DESC_OBJ_ESPECIAL = ? ";

try {
    		
    		ps = con.prepareStatement(sql);
    		ps.setString(1,endereco);
    		ps.execute();
    		GeraLog.info("objeto especial adicionado com sucesso !");
    		
    		//retornando o objeto recém inserido.
    		ps2 = con.prepareStatement(sql2);
    		ps2.setString(1, endereco);
    		rs = ps.executeQuery();
    		while(rs.next()){
    			oevo.setCodigo(rs.getInt("COD_OBJ_ESPECIAL"));
    			oevo.setDescricao(rs.getString("DESC_OBJ_ESPECIAL"));
    		}
    		GeraLog.info("objeto especial retornado com sucesso !");
    	} catch (SQLException se) {
    		GeraLog.error("Erro em /fontes/process_jsp/modulos/processos/terracap/EndObjAcaoTerracapDao.insereObjetosEspeciais() \n SQL = " + sql, se);
    	}finally{
    		Conexao.fecharConexao(con,ps, rs);
    	}
bruno.fantin

Cara, é dessa forma mesmo que você citou que faço funcionar.

A unica diferença é que não utilizo as classes do driver do Oracle.

Faço assim.

s = con.prepareCall(“begin insert into teste (campo) values (?) returning id into ?; end;”);

s.setString(1, “qualquer”);
s.registerOutParameter(2, java.sql.Types.INTEGER);

s.executeUpdate();

Id = s.getInt(2);

Falou.

lazaropj

deu certo \o/

obrigado bruno.fantin

segue a baixo o codigo completo e funcionando

Connection con = Conexao.getInstance().getConnection();
int ultimoId = 0;

try {
CallableStatement s = con.prepareCall("begin insert into "+executa.usuarioDB+"obj_especiais(DESC_OBJ_ESPECIAL) values(?) returning cod_obj_especial into ?; end;");
s.setString(1, endereco);
s.registerOutParameter(2, java.sql.Types.INTEGER);
s.executeUpdate();

ultimoId = s.getInt(2);
GeraLog.info("código do objeto especial retornado com sucesso !" + ultimoId);
} catch (SQLException e) {
GeraLog.error("Erro em /fontes/process_jsp/modulos/processos/terracap/EndObjAcaoTerracapDao.insereObjetosEspeciais() \n " );
e.printStackTrace();
}finally{
Conexao.fecharConexao(con);
}

return ultimoId;
Criado 16 de agosto de 2010
Ultima resposta 16 de ago. de 2010
Respostas 5
Participantes 4