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:[email protected]
Teléfono: 53-33-266200


El 13/01/2010 10:28 AM, Yudelsy Castellón García escribió:
>
> -----Mensaje original-----
> De: Fernando Hevia [mailto:[email protected]]
> Enviado el: Wednesday, January 13, 2010 10:22 AM
> Para: 'Yudelsy Castellón García'; [email protected]
> 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
 

--
TIP 10: no uses HTML en tu pregunta, seguro que quien responda no podrá leerlo

Responder a