RV: RV: RV: duda con funcion

From: Yudelsy Castellón García <yude(at)cav(dot)desoft(dot)cu>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RV: RV: RV: duda con funcion
Date: 2010-01-18 15:52:33
Message-ID: 001f01ca9856$3fee4630$bfcad290$@desoft.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola a todos, la solución que me dan en este post solamente funciona con
un solo parámetro porque cuando paso a la función más de un parámetro da
error, dice que "$2" must be of type cursor or refcursor, la verdad que
no sé qué hacer con el tema de las funciones que devuelven cursores,
porque no puedo devolver setof ya que la cantidad de columnas a retornar
en la función es variable.

Alguien podría ayudarme?

Saludos,

Ing. Esneiker Enriquez Cabrera.
Excelencia en Software.
Desoft S.A. en Ciego de Ávila.
Joaquín de Agüero Esq. Calle 2. Ciego de Ávila. Cuba.
email:eenriquez(at)cav(dot)desoft(dot)cu
Teléfono: 53-33-266200

El 13/01/2010 10:28 AM, Yudelsy Castellón García escribió:
>
> -----Mensaje original-----
> De: Fernando Hevia [mailto:fhevia(at)ip-tel(dot)com(dot)ar]
> Enviado el: Wednesday, January 13, 2010 10:22 AM
> Para: 'Yudelsy Castellón García'; pgsql-es-ayuda(at)postgresql(dot)org
> Asunto: RE: [pgsql-es-ayuda] RV: duda con funcion
>
>
>
>
>> -----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.
>
>
> __________ Información de ESET NOD32 Antivirus, versión de la base de
firmas
> de virus 4762 (20100111) __________
>
> ESET NOD32 Antivirus ha comprobado este mensaje.
>
> http://www.eset.com
>
>
>
>
> __________ Información de ESET NOD32 Antivirus, versión de la base de
firmas
> de virus 4762 (20100111) __________
>
> ESET NOD32 Antivirus ha comprobado este mensaje.
>
> http://www.eset.com
>
>
>
>

__________ Información de ESET NOD32 Antivirus, versión de la base de firmas
de virus 4762 (20100111) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com

__________ Información de ESET NOD32 Antivirus, versión de la base de firmas
de virus 4762 (20100111) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Eduardo Morras 2010-01-18 16:44:56 error 10061 en Winsock
Previous Message Diego Ayala 2010-01-18 14:21:38 Re: doble guion bajo