Eu recomendaria usar o RETURNING do insert:

BEGIN;
  INSERT INTO tb_grupo_subcontas (nome)
  VALUES ('Teste')
  RETURNING id
  INTO id_grupo2;
  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);
COMMIT;

Estou assumindo que você está dentro de uma FUNCTION.

abços
--
Matheus de Oliveira

Bacharelado em Ciências de Computação
Laboratório de Computação de Alto Desempenho -
LCAD<http://www.lcad.icmc.usp.br/>
Instituto de Ciências Matemáticas e de Computação -
ICMC<http://www.icmc.usp.br/>
Universidade de São Paulo - USP <http://www.sc.usp.br/>




On Tue, Mar 6, 2012 at 11:08 AM, Fabrízio de Royes Mello <
[email protected]> wrote:

>
>
> 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
>
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a