RE: Funciòn que devuelve un refcursor

From: ALFONSO REYES <alfonsoreyescruz(at)hotmail(dot)com>
To: <alvherre(at)commandprompt(dot)com>
Cc: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: Funciòn que devuelve un refcursor
Date: 2008-12-07 19:48:20
Message-ID: BLU148-W2008D038FFE53737BFC721DFFC0@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


Estimado Alvaro mucha gracias por tú respuesta tengo algunas dudas:

Cuando dices que retorne un conjunto de resultados te refieres a un set of ?
Si es así, bueno no hice esto ya que crei que eso se hacía cuando queria que una función me retorne varios ref cursors de casos diferentes y tambien por que esta función es invocada desde C#, para mostrar los resultados obtenidos...

Además esta función ya esta implementada en el cliente y no quisiera tener que hacer una nueva funciòn de busqueda para que me retorne los códigos de personas, pero si no hay otra solución pues no tengo mas remedio que cambiar

De no ser el caso quisiera me indiques como hago para que retorne un conjunto de resultados .

Ahora agradecería me indiquen con algún ejemplo como puedo recorrer esa varible, o si no es viable como debería programar para poder reutilziar las funciones de busqueda a continuación el código de la función per_sp_obt_persona

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 "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 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 p_cur_resultado;
--return;
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 p_cur_resultado;
--return;

end if;


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

Gracias por su ayuda

> Date: Sun, 7 Dec 2008 14:13:20 -0300
> From: alvherre(at)commandprompt(dot)com
> To: alfonsoreyescruz(at)hotmail(dot)com
> CC: pgsql-es-ayuda(at)postgresql(dot)org
> Subject: Re: Funciòn que devuelve un refcursor
>
> ALFONSO REYES wrote:
>
> > CREATE OR REPLACE FUNCTION "danmaf"."fac_obt_cab_factura" (p_identificacion
> > integer, p_fact_fisica varchar, p_fecha date, p_primer_nombre varchar,
> > p_apellido_paterno varchar, p_razon_social varchar) RETURNS
> > "pg_catalog"."refcursor" AS
> > $body$
> > DECLARE
> > v_cur_resultado pg_catalog.refcursor;
> > BEGIN
> >
> > begin
> > select danmaf.per_sp_obt_persona( p_identificacion, p_primer_nombre,
> > p_apellido_paterno, p_razon_social, v_cur_resultado);
> >
> > end;
> >
> > END;
> > $body$
> > LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
> >
> > Como pueden ver almaceno el cursor en la varible v_cur_resultado,
> > dentro de ese cursor hay un campo id_persona, necesito comparar o leer
> > ese campo contra otra tabla pero no se como hacer esoasi que si
> > alguien tiene una idea me ayudaría mucho.
>
> Todo esto es muy confuso. ¿Por qué estás usando un refcursor? ¿Por qué
> no haces que per_sp_obt_persona retorne un conjunto de resultados común
> y corriente?
>
> PD: la direccion de la lista es pgsql-es-ayuda(at)postgresql(dot)org(dot) No
> envíes a pgsql-es-ayuda-owner a menos que sea algo administrativo.
>
> --
> Alvaro Herrera http://www.CommandPrompt.com/
> The PostgreSQL Company - Command Prompt, Inc.

_________________________________________________________________
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 Alvaro Herrera 2008-12-07 19:52:26 Re: RE: Funciòn que devuelve un refcursor
Previous Message Alvaro Herrera 2008-12-07 17:13:20 Re: Funciòn que devuelve un refcursor