RE: RE: Funciòn que devuelve un refcursor

From: ALFONSO REYES <alfonsoreyescruz(at)hotmail(dot)com>
To: Alvaro herrera 2 <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: lista ayuda postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: RE: Funciòn que devuelve un refcursor
Date: 2008-12-08 14:03:43
Message-ID: BLU148-W31082442FD1AD087C6F834DFFD0@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


Perdon la función que envie, no es la correcta, ya le corregi y cuando la depuro funciona correctamente, pero no se como ejecutarla desde el pgadmin.
From: alfonsoreyescruz(at)hotmail(dot)com
To: alvherre(at)alvh(dot)no-ip(dot)org
CC: pgsql-es-ayuda(at)postgresql(dot)org
Subject: RE: [pgsql-es-ayuda] RE: Funciòn que devuelve un refcursor
Date: Sun, 7 Dec 2008 20:07:12 +0000

Alvaro muchas gracias la función quedo como te indico a continuación, debo hacer que sea de tipo record? o esta bien asi...

Disculpa el abuso pero quisera aprovechar el problema para aclarar las dudas

y disculpa la ignoracia cual es la diferencia entre una funcion "set of record" y una funciòn "set of refcursor"

Y podrias indicarme como hago que se ejecute en el pgadmin ya que me sale este error cuando la quiero ejecutar:

ERROR: se llamó una función que retorna un conjunto en un contexto que no puede aceptarlo
CONTEXT: PL/pgSQL function "per_sp_obt_persona" line 54 at RETURN NEXT

Mil gracias nuevamente..

CREATE OR REPLACE FUNCTION "danmaf"."per_sp_obt_persona" (p_identificacion varchar, p_primer_nombre varchar, p_apellido_paterno varchar, p_razon_social varchar, p_cur_resultado "pg_catalog"."refcursor") RETURNS SETOF "pg_catalog"."refcursor" AS
$body$
declare
v_persona INTEGER;
v_desc_error "varchar"(200);
BEGIN

begin

select count(1)
into v_persona
from danmaf.per_personas p
where (p.identificacion=upper(p_identificacion) or upper(p_identificacion) is null)
and (p.primer_nombre=upper(p_primer_nombre) or upper(p_primer_nombre) is null)
and (p.apellido_paterno=upper(p_apellido_paterno) or upper(p_apellido_paterno) is null)
and (p.razon_social like upper(p_razon_social)||'%' or upper(p_razon_social) is null);

if v_persona=0 then
open p_cur_resultado
FOR select '-1403' as codigo, 'Error persona no se encuentra Registrada CI';
return next p_cur_resultado;
end if;

end;

if p_razon_social is null then

open p_cur_resultado FOR

select p.id_persona,p.identificacion,p.razon_social,p.primer_nombre,p.segundo_nombre,p.apellido_paterno,
p.apellido_materno,tel.numero,d.direccion,p.sexo,p.tipo_persona,p.tipo_identificacion,p.fecha_nacimiento,p.contribuyente_esp
from danmaf.per_telefono tel right join
danmaf.per_personas p on (tel.id_persona=p.id_persona ) left join danmaf.per_direcciones d on (p.id_persona=d.id_persona )

where (p.identificacion=upper(p_identificacion) or upper(p_identificacion) is null)
and (p.primer_nombre=upper(p_primer_nombre) or upper(p_primer_nombre) is null)
and (p.apellido_paterno=upper(p_apellido_paterno) or upper(p_apellido_paterno) is null)
and (d.tipo ='D' or d.tipo is null)
and (tel.tipo ='D' or tel.tipo is null);



return next p_cur_resultado;

else

open p_cur_resultado FOR
select p.id_persona,p.identificacion,p.razon_social,p.primer_nombre,p.segundo_nombre,p.apellido_paterno,
p.apellido_materno,tel.numero,d.direccion,p.sexo,p.tipo_persona,p.tipo_identificacion,p.fecha_nacimiento,p.contribuyente_esp
from danmaf.per_telefono tel right join
danmaf.per_personas p on (tel.id_persona=p.id_persona ) left join danmaf.per_direcciones d on (p.id_persona=d.id_persona )

where p.razon_social like '%'||upper(p_razon_social)||'%'
and (d.tipo = 'O' or d.tipo is null);

return next p_cur_resultado;


end if;


END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

> Date: Sun, 7 Dec 2008 17:01:26 -0300
> From: alvherre(at)alvh(dot)no-ip(dot)org
> To: alfonsoreyescruz(at)hotmail(dot)com
> CC: pgsql-es-ayuda(at)postgresql(dot)org
> Subject: Re: [pgsql-es-ayuda] RE: Funciòn que devuelve un refcursor
>
> ALFONSO REYES escribió:
> >
> >
> > Estimado Alvaro
> >
> > Ok muchas gracias por tú interes, disculpa ya cambie la función para
> > que me retorne un set of, puedes indicarme los pasos para leer ese
> > conjunto desde la otra función ...
>
> Simplemente usa
>
> DECLARE
> r record;
> BEGIN
> FOR r IN SELECT la_funcion()
> LOOP
> -- hacer algo aquí con r.*
> END LOOP;
> END
>
>
> --
> Alvaro Herrera http://www.amazon.com/gp/registry/3BP7BYG9PUGI8
> "I would rather have GNU than GNOT." (ccchips, lwn.net/Articles/37595/)

Explore the seven wonders of the world Learn more!
_________________________________________________________________
Connect to the next generation of MSN Messenger 
http://imagine-msn.com/messenger/launch80/default.aspx?locale=en-us&source=wlmailtagline

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Gabriel Hermes Colina Zambra 2008-12-08 15:29:43 Re: Error al trabajar con base
Previous Message Gilberto Castillo Martínez 2008-12-08 13:36:48 Re: Lineas de comando en linux para respaldar y restaurar en postgres