Muito obrigado a todos!

Abs

Bruno Neiva Moreno
http://about.me/brunomoreno



Em 6 de março de 2012 11:29, Matheus de Oliveira
<[email protected]>escreveu:

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

Responder a