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
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 |