hay una vista en el pgadmin que te permite hacer esto: Query Browser, donde 
puedes ejecutar no sólo consultas sino también los procedimientos que hayas 
hecho. Si te da algún problema: puedes entonces correrlo dentro del psql: 
@- psql tu_database 
Teniendo guardada la funcion en un .sql puedes correrlo con : 
\i archivo.sql; 
y te daria los resultados. 
PD: Para esto es bueno siempre programar las funciones de la forma: CREATE OR 
REPLACE FUNCTION funcion, en caso de que quieras volverla a correr. 
saludos 

----- Mensaje original ----- 
De: "ALFONSO REYES" <[EMAIL PROTECTED]> 
Para: "Alvaro herrera 2" <[EMAIL PROTECTED]> 
CC: "lista ayuda postgres" <pgsql-es-ayuda@postgresql.org> 
Enviados: Lunes, 8 de Diciembre de 2008 9:03:43 (GMT-0500) Auto-Detected 
Asunto: RE: [pgsql-es-ayuda] RE: Funciòn que devuelve un refcursor 

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 Get it now! 

-- 


""A mí Windows nunca se me ha colgado" 
" 
Pinocho .. 

Marcos Ortiz Valmaseda 
Linux User # 418229 
Debian && OpenSUSE proud user 

Responder a