Em 6 de março de 2012 11:01, Bruno Moreno <[email protected]> escreveu:

> Pessoal, estou com uma pequena dúvida quanto ao uso do tipo SERIAL no PG.
> Tenho um relacionamento NxN e uma dessas tabelas tem um identificador do
> tipo SERIAL. Preciso recuperar o último valor para colocar na relação que
> realiza o relacionamento. Tentei tal qual a SQL abaixo porém o PG sempre me
> retorna uma mensagem assim: *"ERRO:  could not open relation with OID 3".*
> *
> *
> Estou procedendo da maneira correta? Para pegar o valor corrente eu
> utilizei a função *curval*(). O que pode estar dando errado?
>
> *BEGIN;*
> *insert into tb_grupo_subcontas (nome) values ('Teste');*
> *select currval(id) into id_grupo2 from tb_grupo_subcontas;*
> *insert into tb_grupo_subcontas_subcontas (id_grupo, id_subconta) values
> (id_grupo2, 1);*
> *insert into tb_grupo_subcontas_subcontas (id_grupo, id_subconta) values
> (id_grupo2, 2);*
> *END;*
> *COMMIT;*
>
>
Vc está utilizando a função "currval" [1] de maneira incorreta. Vc precisa
passar para ela o nome da sequence que foi incrementada pelo último
"nextval" dentro da sessão. O correto seria mais ou menos assim:

BEGIN;
  INSERT INTO tb_grupo_subcontas (nome) VALUES ('Teste');
  INSERT INTO tb_grupo_subcontas_subcontas (id_grupo, id_subconta)
    VALUES (currval('tb_grupo_subcontas_id_seq'), 1);
  INSERT INTO tb_grupo_subcontas_subcontas (id_grupo, id_subconta)
    VALUES (currval('tb_grupo_subcontas_id_seq'), 2);
COMMIT;

Pode ser que vc precise fazer algum ajuste no exemplo acima, mas creio que
já seja um bom começo.


[1] http://www.postgresql.org/docs/9.1/static/functions-sequence.html

-- 
Fabrízio de Royes Mello
Consultoria/Coaching PostgreSQL
>> Blog sobre TI: http://fabriziomello.blogspot.com
>> Perfil Linkedin: http://br.linkedin.com/in/fabriziomello
>> Twitter: http://twitter.com/fabriziomello
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a