RE: RV: duda con funcion

From: "Fernando Hevia" <fhevia(at)ip-tel(dot)com(dot)ar>
To: 'Yudelsy Castellón García' <yude(at)cav(dot)desoft(dot)cu>, <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: RV: duda con funcion
Date: 2010-01-13 15:22:17
Message-ID: 15A08E0E90AB410DA68F8A6DB46C6409@iptel.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

> -----Mensaje original-----
> De: Yudelsy Castellón García
>
> Hola comunidad, hace días he tenido problemas con retornar
> set de resultados desde funciones. Me dieron una solución la
> cual consiste en la siguiente funcion:
>
> CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS '
> BEGIN
> OPEN $1 FOR SELECT * FROM nmusuario;
> RETURN $1;
> END;
> ' LANGUAGE plpgsql;
>
> -- BEGIN;
> SELECT reffunc('funccursor');
> FETCH ALL IN funccursor;
> -- COMMIT;
>
> Esa solución funciona muy bien cuando la función no precisa
> de parámetros de entrada, porque cuando hago lo siguiente:
>
> CREATE FUNCTION eliminar(parametro character varying,
> refcursor) RETURNS refcursor AS '
> declare micursor refcursor;
> BEGIN
> OPEN micursor FOR SELECT * FROM nmusuario;
> RETURN micursor;
> END;
> ' LANGUAGE plpgsql;
>
> -- BEGIN;
> SELECT eliminar('probando','funccursor');
> FETCH ALL IN funccursor;
> -- COMMIT;
>
> me da como error ERROR: cursor "funccursor" does not exist,
> la verdad es que esto se hace muy simple en otros gestores de
> base de datos, no tengo idea de por qué en postgres lo han
> complicado tanto.
>
> Agradecería cualquier ayuda.
>

Primero, en la segunda función estás definiendo el nombre del cursor
internamente. Si al nombre del cursor lo estás especificando por parámetro,
al abrir el cursor define explícitamente de qué parámetro debe tomar el
nombre:

CREATE FUNCTION eliminar(parametro character varying, refcursor) RETURNS
refcursor AS '
BEGIN
OPEN $2 FOR SELECT * FROM nmusuario;
RETURN $2;
END;
' LANGUAGE plpgsql;

Segundo, el select y el fetch deben estar dentro de la misma transacción:

BEGIN;
SELECT eliminar('probando', 'funccursor');
FETCH ALL IN funccursor;
...
COMMIT;

Lo raro es que si ejecuto exactamente la misma función que definiste, en la
primera ejecución el Select me retorna
<unnamed portal 1>

Pero en las subsiguientes me retorna 'funccursor' y el fetch funciona
correctamente.
Posiblemente un comportamiento errático. La forma que te sugiero funciona
siempre.

Saludos,
Fernando.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Francisco Reyes 2010-01-13 15:42:49 Re: Duda con LIKE
Previous Message Fernando Hevia 2010-01-13 14:57:12 RE: Duda con LIKE