PreparedStatement com Select aninhado, é possível?

6 respostas
R
Olá pessoal, estou tentando fazer um PreparedStatement do tipo:

INSERT INTO tabela1 (a, b, c, d) VALUES (?,?,?,?);

Porém com select aninhado:

INSERT INTO tabela1 (a, b, c, d) VALUES (?,(SELECT e FROM tabela2 WHERE 1+1 =2),?,?);

Porém, não estou conseguindo. Lembro que  tentei fazer antes e não consegui, tendo que fazer tudo através de uma String e não utilizar mais o PreparedStatement. Alguém sabe como faze-lo, caso seja possível ?

Ahhh… E outra, gostaria de saber como fazer o tratamento de transações de forma efetiva, pois pelo visto a primeira tabela que eu insiro funciona independente da outra. Ela insere mesmo que a outra dê erro. Além disso, desta mesma forma (Usando apenas Statement), eu consegui fazer o tratamento…

Valeu !! =D

6 Respostas

mduques

É totalmente possível. Só se preocupe em saber se o seu select retorna apenas um valor sacou?

Pra vc fazer transação com jdbc, pegue sua connection e

conn.setAutoCommit(false);

ai no final da sua transação um conn.commit()

conn.setAutoCommit(false);
//inserts... updates...
conn.commit();
R

mduques:
É totalmente possível. Só se preocupe em saber se o seu select retorna apenas um valor sacou?

Pra vc fazer transação com jdbc, pegue sua connection e

conn.setAutoCommit(false);

ai no final da sua transação um conn.commit()

conn.setAutoCommit(false); //inserts... updates... conn.commit();


Valeu cara. Quanto a retornar apenas um valor, eu acho que entendi. O que eu faço na verdade é apenas um SELECT MAX() …, então iria retornar apenas um valor mesmo. O meu banco está em firebird (infelizmente não posso modificar isso). Você saberia se neste caso ainda é possível fazer o PreparedStatement com o Select aninhado ?

Valeu (novamente).

mduques

Olha só, eu não sei o sgbd (firebird) tem a particularidade de nãoexecutar isso, eu particularmente acho que nao, já usei isso em diversos bancos… mysql, oracle, sqlserver, postgress etc. Então acho que é possível no firebird, é sql ansi então é totalmente possível. Qual o erro que acontece? Qual é o seu sql?

R

Cara, tá assim:

“INSERT INTO pessoal (codfuncionario, dtcad, funcao, nome, dtnasc, sexo, rg, cpf, lograd, comple, bairro, cidade, cep, uf, fone, celular, cracha, compbati, situacao, cgcodigo, apelido, vinculo,empresa) VALUES ((SELECT MAX(crreferencia) FROM tbcracha WHERE crreferencia < 999999999),?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,(SELECT MAX(crreferencia) AS valor FROM tbcracha WHERE crreferencia < 999999999),?,?,?,?,?,?)”
, só que agora eu vi que o erro é pq ele tá violando uma chave primária…
GDS Exception. 335544665. violation of PRIMARY or UNIQUE KEY constraint “PK_PESSOAL” on table “PESSOAL”.
Isso ocorre pq ele pega o último número e o certo seria pegar o último número e somar um. Só que não estou sabendo como faze-lo, neste caso…

mduques

INSERT INTO pessoal (codfuncionario, dtcad, funcao, nome, dtnasc, sexo, rg, cpf, lograd, comple, bairro, cidade, cep, uf, fone, celular, cracha, compbati, situacao, cgcodigo, apelido, vinculo,empresa)
VALUES ((SELECT MAX(crreferencia) FROM tbcracha WHERE crreferencia < 999999999)+1,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,(SELECT MAX(crreferencia) AS valor FROM tbcracha WHERE crreferencia < 999999999),?,?,?,?,?,?)"

ou

INSERT INTO pessoal (codfuncionario, dtcad, funcao, nome, dtnasc, sexo, rg, cpf, lograd, comple, bairro, cidade, cep, uf, fone, celular, cracha, compbati, situacao, cgcodigo, apelido, vinculo,empresa)
VALUES ((SELECT MAX(crreferencia) +1 FROM tbcracha WHERE crreferencia < 999999999)+1,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,(SELECT MAX(crreferencia) AS valor FROM tbcracha WHERE crreferencia < 999999999),?,?,?,?,?,?)

R

Neste caso dá esse erro: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
expression evaluation not supported… Mas eu resolvi, fazendo uma Procedure pra pegar o último valor !!

Valeu mais uma vez !! =D

Criado 24 de outubro de 2008
Ultima resposta 28 de out. de 2008
Respostas 6
Participantes 2