Qual é o jeito certo de pegar o ID gerado pelo fireburn quando eu faço um:
insert into users(name) values('saoj') returning id;
Devo usar um CallableStatement?
Devo colocar o meu insert entre call { … } ?
Devo usar o registerOutParameter ?
Qual é o jeito certo de pegar o ID gerado pelo fireburn quando eu faço um:
insert into users(name) values('saoj') returning id;
Devo usar um CallableStatement?
Devo colocar o meu insert entre call { … } ?
Devo usar o registerOutParameter ?
public static void main(String[] args) throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mca", "root", "root");
PreparedStatement pst = conn.prepareStatement("INSERT INTO TESTE (NOME) VALUES (?)", Statement.RETURN_GENERATED_KEYS);
pst.setString(1, "FIERODD");
pst.executeUpdate();
ResultSet rs = pst.getGeneratedKeys();
int id = 0;
if(rs.next()){
id = rs.getInt(1);
}
}
no mysql funciona assim
[quote=mauricioadl][code]
public static void main(String[] args) throws SQLException, ClassNotFoundException {
Class.forName(“com.mysql.jdbc.Driver”);
Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mca”, “root”, “root”);
PreparedStatement pst = conn.prepareStatement(“INSERT INTO TESTE (NOME) VALUES (?)”, Statement.RETURN_GENERATED_KEYS);
pst.setString(1, “FIERODD”);
pst.executeUpdate();
ResultSet rs = pst.getGeneratedKeys();
int id = 0;
if(rs.next()){
id = rs.getInt(1);
}
}
[/code]
no mysql funciona assim[/quote]
No MySQL vc pode usar o last_insert_id() que te dá isso de mão beijada.
O driver JDBC do Firebird não suporta getGeneratedKeys(), acredite se quiser.
bom, vamos por partes.
firebird eh um lixo! se possivel saia dele o mais rapido possivel, vai por mim!
se vc nao puder sair dele, use store procedures, ou algum framework orm.
ou se nao, use o velho e bom select max(id).
Só uso mysql. Isso aí é para fazer o MentaBean suportar Firebird.
Só queria saber qual é o jeito certo de chamar o tal do “insert … returning” via CallableStatement. Se tem que colocar entre “call { }”, chamar o registerOutParameter, etc.
[quote]
ou se nao, use o velho e bom select max(id).[/quote]
Isso é muito tosco. Só funciona se locar a tabela inteira enquanto estiver fazendo o select max(id).
entao, o callablestatement eh pra store procedures. se vc der insert ele nao vai funcionar
dae vc pode dar um register parameter que da certo.
Da uma olhada aqui: http://www.firebirdsql.org/refdocs/langrefupd21-insert.html
Segundo esta discução: http://comments.gmane.org/gmane.comp.db.firebase.portuguese/70972
o returning está disponivel a partir da versão 2.0 do firebird.
[quote=romarcio]Da uma olhada aqui: http://www.firebirdsql.org/refdocs/langrefupd21-insert.html
Segundo esta discução: http://comments.gmane.org/gmane.comp.db.firebase.portuguese/70972
o returning está disponivel a partir da versão 2.0 do firebird.[/quote]
Valeu pela ajuda, mas ainda estou vendido no lance. Eu entendi como o returning funciona, mas não tenho firebird aqui (tô no mac) para testar. Eu precisaria saber direitinho como fazer a chamada JDBC para pegá-lo. Tenho que usar call { insert … returning id } para fazer o insert com returning? Tenho que usar prepareOutParameter no callablestatement? Alguém que tem o firebird e efetivamente fez isso teria que me responder.
INSERT INTO rua (nome) VALUES (?) RETURNING codigo
stmt = (FirebirdPreparedStatement) conn.prepareStatement(INSERIR);
stmt.setString(1, rua.getNome());
rs = stmt.executeQuery();
rs.next();
return rs.getInt("codigo");
Firebird era um lixo nas versões anteriores da 2.1.
[quote=Jose111][code]
INSERT INTO rua (nome) VALUES (?) RETURNING codigo
stmt = (FirebirdPreparedStatement) conn.prepareStatement(INSERIR);
stmt.setString(1, rua.getNome());
rs = stmt.executeQuery();
rs.next();
return rs.getInt(“codigo”);
[/code]
Firebird era um lixo nas versões anteriores da 2.1.[/quote]
Vamos lá José. Me explica isso direitinho, pois agora fiquei curioso.
1 - Pelo que entendi não precisa fazer cast nenhum para FirebirdPreparedStatement. Isso seria muito ruim, pois a função do JDBC é justamente te deixar independente de qualquer API proprietária do banco-de-dados. Pra isso que cada database fornece o seu database driver.
2 - Vc executa um INSERT com prepared statement e executeQuery? Geralmente se faz isso com executeUpdate, mas aí vc não tem result set para pegar o seu código. Se funcionar beleza, mas confirma isso pra mim, please.
Vc me explicando isso vou fazer o mentabean suportar isso de forma transparente, ou seja, vc apenas faz session.insert(street) e a chave primária (codigo) da rua vai pra dentro do objeto street automaticamente. Ele faz tudo isso pra vc por trás dos panos, do mesmo jeito que ele faz para MySQL. Só que no mysql ele insere e depois faz um select last_insert_id() para pegar o id gerado e injetar no objeto.
1-
É o cast não precisa…
2-
Isso mesmo! O comando insert te retorna um resultado, então você pode executar com executeQuery que ele retorna um ResulSet com o que você colocou no returning.
Quanto a ultima parte de jogar o código de chave primaria no objeto é somente você fazer um rs.next() e pegar o valor do campo depois…