Hola, me autorespondo. Existen 4 metodos:

1) Refcursor como un parametro adicional de la funcion. El cursor se abre para 
presentar los resultados de un select, esto obliga a que el usuario final 
despues de usar el cursor deba cerrarlo (aplica para cuando se una ese cursor 
dentro de otra function). Despues de ejecutar la function, el usuario de la 
function debe hacer un fetch all para mostrar los resultados a pgadmin o al 
lenguaje (VB, Java, Net, etc) (recomendado ya que permite que la function 
devuelva diferentes resultados de acuerdo al diseño de la solución de negocio)

2) Function que devuelve un setof record y varios parametros adicionales out 
dependiendo del resultado del select. La function debe ejecutar un return 
query. (es bueno ya que el usuario de la function no le toca hacer fetch all) 
pero la function solo puede retornar un tipo de registro y sería engorroso a la 
hora de modificar el codigo de la function y de las functions que la llaman.

3) Function que devuelve un tipo clase tabla (public.tabla), esto aplica cuando 
solo vamos a traer registros de una tabla en especifico (es bueno ya que el 
usuario de la function no le toca hacer fetch all), pero no se puede para 
retornar resultados de consultas de varias tablas. (poco recomendado)
4) Function que devuelve un objeto table con una estructura definida en el 
resultado de la function.La function debe ejecutar un return query.  (es bueno 
ya que el usuario de la function no le toca hacer fetch all), pero al igual que 
el punto 2 solo esta amarrado a una estructura de registro.



________________________________
De: Alejandro Carrillo <faster...@yahoo.es>
Para: "pgsql-es-ayuda@postgresql.org" <pgsql-es-ayuda@postgresql.org>
Enviado: lunes 3 de octubre de 2011 9:06
Asunto: [pgsql-es-ayuda] Ayuda al obtener cursor de una funcion


Buenos días,

La presente es para solicitar una inquietud acerca de como obtener los 
resultados de un cursor de una funcion de este estilo.
-- DROP FUNCTION sigc_admidatounico.get_dato2(integer, character varying, date, 
numeric);

CREATE OR REPLACE FUNCTION sigc_admidatounico.get_dato2(p_iddato integer, 
p_nombredato character varying, p_fecha date, p_edad numeric)
  RETURNS refcursor AS
$BODY$
 DECLARE
  ocursor refcursor;
-- Uso de esta función: SELECT public.get_clientes(p1, p2, ... , pn,'cur') ; 
fetch all in cur;
 BEGIN 
  if p_iddato!= null then 
   OPEN oCursor FOR Select 
    iddato, nombredato, fecha, edad
    from 
    public.dato
    WHERE iddato
 = p_iddato;
 else
   OPEN oCursor FOR Select 
    iddato, nombredato, fecha, edad
    from 
    public.dato
    WHERE coalesce(iddato,'0') = coalesce(p_iddato,coalesce(iddato,'0'))
     and coalesce(nombredato,'') like coalesce('%'||p_nombredato||'%','%%')
     and coalesce(fecha,now()) = coalesce(p_fecha,coalesce(fecha,now()))
     and coalesce(edad,'0') = coalesce(p_edad,coalesce(edad,'0'))
    ;
 end if;
 RETURN oCursor; 
 END; 
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Como se puede ver esta funcion retorna un refcursor. Ahora la pregunta es ¿como 
puedo visualizar los datos de ese refcursor retornado?

Gracias,

Alejandro

Posdata: no quiero hacerlo de esta forma SELECT public.get_clientes(p1, p2, ... 
, pn,'cur') ; fetch all in cur;
Donde cur es una variable de entrada del cursor, ya que quiero que el usuario 
solo ingrese los parametros que realmente corresponden a esta función y no 
meter un parámetro adicional.

Reply via email to