[Pgsql-ayuda] Invocacion de una funcion

Alvaro Herrera Munoz alvherre@dcc.uchile.cl
Tue, 12 Aug 2003 19:01:19 -0400


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")