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: [EMAIL PROTECTED]
To: [EMAIL PROTECTED]
CC: pgsql-es-ayuda@postgresql.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: [EMAIL PROTECTED]
> To: [EMAIL PROTECTED]
> CC: pgsql-es-ayuda@postgresql.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

Responder a