[pgbr-geral] Dúvida tipo SERIAL

2012-03-06 Por tôpico Bruno Moreno
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

2012-03-06 Por tôpico Fabrízio de Royes Mello
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

2012-03-06 Por tôpico Matheus de Oliveira
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

2012-03-06 Por tôpico Bruno Moreno
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