[pgbr-geral] Dúvida tipo SERIAL
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;* Obrigado! Bruno Neiva Moreno http://about.me/brunomoreno ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Dúvida tipo SERIAL
Em 6 de março de 2012 11:01, Bruno Moreno brunone...@gmail.com 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 pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Dúvida tipo SERIAL
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 - LCADhttp://www.lcad.icmc.usp.br/ Instituto de Ciências Matemáticas e de Computação - ICMChttp://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 fabriziome...@gmail.com wrote: Em 6 de março de 2012 11:01, Bruno Moreno brunone...@gmail.com 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 pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Dúvida tipo SERIAL
Muito obrigado a todos! Abs Bruno Neiva Moreno http://about.me/brunomoreno Em 6 de março de 2012 11:29, Matheus de Oliveira matioli.math...@gmail.comescreveu: 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 - LCADhttp://www.lcad.icmc.usp.br/ Instituto de Ciências Matemáticas e de Computação - ICMChttp://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 fabriziome...@gmail.com wrote: Em 6 de março de 2012 11:01, Bruno Moreno brunone...@gmail.comescreveu: 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 pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral