Re: RE: Funciòn que devuelve un refcursor

From: Marcos Ortiz Valmaseda <mlortiz(at)estudiantes(dot)uci(dot)cu>
To: ALFONSO REYES <alfonsoreyescruz(at)hotmail(dot)com>
Cc: lista ayuda postgres <pgsql-es-ayuda(at)postgresql(dot)org>, Alvaro herrera 2 <alvherre(at)alvh(dot)no-ip(dot)org>
Subject: Re: RE: Funciòn que devuelve un refcursor
Date: 2008-12-08 10:05:15
Message-ID: 3971557.1381401228730715016.JavaMail.root@zimbra2.uci.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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" <alfonsoreyescruz(at)hotmail(dot)com>
Para: "Alvaro herrera 2" <alvherre(at)alvh(dot)no-ip(dot)org>
CC: "lista ayuda postgres" <pgsql-es-ayuda(at)postgresql(dot)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: 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 Get it now!

--

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

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

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Marcos Ortiz Valmaseda 2008-12-08 10:33:51 Re: Consola
Previous Message Marcos Ortiz Valmaseda 2008-12-08 10:01:00 Re: Lineas de comando en linux para respaldar y restaurar en postgres