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 !!!
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 !!!
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.
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.
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);
}
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.
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;