[Pgsql-ayuda] Invocacion de una funcion

Edwin Quijada listas_quijada@hotmail.com
Wed, 13 Aug 2003 08:59:13 -0400


Gracias!! Mira esta solucion la he usado en muchos otros lugares, claro no
en Postgres, pero me interesa ver tu punto de vista. Pense usar SEQUENCE
pero el problema es que si se genera un numero y la transaccion se aborta el
numero
no vuleve atras. Esto es para documentos en los cuales no puede haber saltos
en la secuencia, al menos eso fue lo que lei acerca de las secuencias. Ahora
bien, si existe una forma de que cuando una transaccion sea cancelada esta
no sea afectada , escucho.
BTW:
Explicame porque dices que esta forma no es correcta??

----- Original Message -----
From: "Alvaro Herrera Munoz" <alvherre@dcc.uchile.cl>
To: "Edwin Quijada" <listas_quijada@hotmail.com>
Cc: "Pgsql" <pgsql-ayuda@tlali.iztacala.unam.mx>
Sent: Tuesday, August 12, 2003 7:01 PM
Subject: Re: [Pgsql-ayuda] Invocacion de una funcion


> On Tue, Aug 12, 2003 at 04:53:20PM -0400, Edwin Quijada wrote:
> > Estoy haciendo mi primera funcion con pl/sql y cuando la ejecuto me da
el
> > sigte error
>
> Primero que nada, te sugiero que uses una secuencia.  Tu solucion tiene
> problemas serios si hay dos transacciones insertando concurrentemente.
> Puedes crear una secuencia con:
> CREATE SEQUENCE
>
> despues la usas asi:
> SELECT nextval('nombre-de-la-secuencia');
> o bien
> SELECT currval('nombre-de-la-secuencia');
>
> Ojo, este currval() devuelve el ultimo valor que la secuencia te
> devolvio _a ti_, no el ultimo valor que le devolvio a cualquiera.  De
> este modo, varios pueden incrementar la secuencia concurrentemente y tu
> puedes llamar a currval() para obtener el valor que tu recibiste.
>
> Tambien puedes usar un campo SERIAL:
> CREATE TABLE docs (
> doc_id SERIAL PRIMARY KEY,
> nombre TEXT
> ...
> )
>
> Y despues haces:
> INSERT INTO docs (nombre , ...) VALUES (...)
> (omitiendo el campo SERIAL).  Automaticamente se va a insertar el valor
> correspondiente de la secuencia.  Ademas, si necesitas el valor para
> otra cosa puedes hacer SELECT currval('docs_doc_id_seq'), y te devuelve
> el valor correcto.
>
>
> >  Error occurred while executing PL/pgSQL function get_secuencia
> > WARNING:  line 6 at SQL statement
> > ERROR:  SELECT query has no destination for result data.
> >         If you want to discard the results, use PERFORM instead.
>
> Si no necesitas lo que devuelva SELECT, entonces usa PERFORM en lugar de
> SELECT (basta con leer el mensaje).  Si necesitas el valor que devuelve,
> entonces usa SELECT INTO.  Pero te aseguro que en este caso esta _no_ es
> la solucion correcta.
>
> --
> Alvaro Herrera (<alvherre[@]dcc.uchile.cl>)
> "El que vive para el futuro es un iluso, y el que vive para el pasado,
> un imbécil" (Luis Adler, "Los tripulantes de la noche")
> _______________________________________________
> Pgsql-ayuda mailing list
> Pgsql-ayuda@tlali.iztacala.unam.mx
> http://tlali.iztacala.unam.mx/mailman/listinfo/pgsql-ayuda
>