Simplemente una idea, no se si mejorará la performance pero,
Por que no probás haciendo que la función devuelva un dato tipo tabla?
y luego trabajás con la tabla?
Algo así:

CREATE OR REPLACE FUNCTION accesobd.get_clientesborradofechas(p_idcliente
bigint, p_codcliente character varying, p_nomcliente character varying,
p_edad integer, p_sepso character varying, p_fechanac date, p_fecha_inicial
date, p_fecha_final date, ocursor refcursor)
  RETURNS TABLE(
    tidcliente tipodato,
    tcodcliente tipodato,
    tnomcliente tipodato,
    tedad tipodato,
    tsepso tipodato,
    tfechanac tipodato,
    tfecha_inicial tipodato,
    tfecha_final tipodato
) AS &&
....
....
return query Select idcliente, codcliente, nomcliente, edad, sepso,
fechanac, fecha_inicial, fecha_final
    from public.clientesborradofechas
    WHERE ....;
....
....

Luego la llamás con
select * from accesobd.get_clientesborradofechas(...

Guillermo Villanueva



El 17 de noviembre de 2011 11:47, Alejandro Carrillo
<[email protected]>escribió:

> Buenos dias,
>
> Conocen algunos metodos para hacer un function, donde se haga un select a
> una tabla, y pueden venir campos nulos en los parámetros del procedimiento,
> de tal forma que esto signifique que pueden venir uno o varios campos a
> consultar (pero la function debe devolver los valores de una forma rápida
> ante millones de registros). Yo he desarrollado esta solución:
>
> CREATE OR REPLACE FUNCTION accesobd.get_clientesborradofechas(p_idcliente
> bigint, p_codcliente character varying, p_nomcliente character varying,
> p_edad integer, p_sepso character varying, p_fechanac date, p_fecha_inicial
> date, p_fecha_final date, ocursor refcursor)
>   RETURNS void AS
> $BODY$
> -- Uso de esta función: SELECT public.get_clientes(p1, p2, ... , pn,'cur')
> ; fetch all in cur;
>  BEGIN
>   if p_idcliente!= null then
>    OPEN oCursor FOR Select
>     idcliente, codcliente, nomcliente, edad, sepso, fechanac,
> fecha_inicial, fecha_final
>     from
>     public.clientesborradofechas
>     WHERE idcliente = p_idcliente;
>  else
>    OPEN oCursor FOR Select
>     idcliente, codcliente, nomcliente, edad, sepso, fechanac,
> fecha_inicial, fecha_final
>     from
>     public.clientesborradofechas
>     WHERE coalesce(idcliente,'0') =
> coalesce(p_idcliente,coalesce(idcliente,'0'))
>      and coalesce(codcliente,'') like coalesce('%'||p_codcliente||'%','%%')
>      and coalesce(nomcliente,'') like coalesce('%'||p_nomcliente||'%','%%')
>      and coalesce(edad,'0') = coalesce(p_edad,coalesce(edad,'0'))
>      and coalesce(sepso,'') like coalesce('%'||p_sepso||'%','%%')
>      and coalesce(fechanac,now()) =
> coalesce(p_fechanac,coalesce(fechanac,now()))
>      and coalesce(fecha_inicial,now()) =
> coalesce(p_fecha_inicial,coalesce(fecha_inicial,now()))
>      and coalesce(fecha_final,now()) =
> coalesce(p_fecha_final,coalesce(fecha_final,now()))
>     ;
>  end if;
>  END;
> $BODY$
>   LANGUAGE plpgsql VOLATILE
>   COST 100;
>
> Agradezco su ayuda con el tema ya que una funcion similar, al parecer,
> esta poniendo muy lento a un reporte.
>

Responder a