Re: Ayuda al obtener cursor de una funcion

From: Alejandro Carrillo <fasterzip(at)yahoo(dot)es>
To: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Ayuda al obtener cursor de una funcion
Date: 2011-10-04 14:19:21
Message-ID: 1317737961.44337.YahooMailNeo@web27403.mail.ukl.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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 <fasterzip(at)yahoo(dot)es>
Para: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)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.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Matias Israel Malpica Escobar 2011-10-04 14:29:22 Como configurar PGpool solo para un pool de conexiones...
Previous Message Cesar Erices 2011-10-04 13:26:07 Re: Consulta sobre postgres 8.4