Re: Retornar varios registros desde una funcion en pl/pgsql

From: Jaime Casanova <systemguards(at)gmail(dot)com>
To: J(dot) Arturo Llanquihuén Martínez <arturo(at)llanquihuen(dot)cl>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Retornar varios registros desde una funcion en pl/pgsql
Date: 2005-02-17 21:55:00
Message-ID: c2d9e70e05021713552dc57225@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On Thu, 17 Feb 2005 16:31:57 -0300, J. Arturo Llanquihuén Martínez
<arturo(at)llanquihuen(dot)cl> wrote:
> Hola listeros
> estoy iniciandome en lo que se refiere a funciones, logrando realizar
> algunas basicas pero muy utiles para mis necesidades, ahora me tope con un
> problema , necesito devolver varios o ningun registro desde una consulta, he
> probado varias soluciones pero la verdad no me funcionan. Adjunto la funcion
> que hice, para que me puedan dar su opinion y en que estoy fallando.
>
> CREATE or replace FUNCTION itinerario.info_geocerca(geometry) RETURNS setof
> public.calles AS '
> DECLARE
> geocerca alias for $1;
> captura_comuna integer;
> captura_datos setof public.calles;
> BEGIN
> select INTO captura_comuna id from public.comunas where
> Intersects(the_geom,geocerca) ;
> IF captura_comuna.region is null THEN
> RAISE INFO ''Punto de Referencia fuera de Area.'';
> RETURN ''0'';
> ELSE
> select INTO captura_datos * from calles where
> comuna=captura_comuna.comuna;
> RETURN captura_datos.nombre;
> END IF;
> END;
> ' LANGUAGE plpgsql;
>
> si alguien me pudiera decir en que me equivoco, o si hay alguna otra manera
> de devolver varios registros se lo agradeceria.
> otra consulta que tengo es dentro de la funcion es como y de que manera es
> mas optimo recorrer los registros de captura_datos
> para seguir aplicando filtros.
>
> agradecido de antemano.
>
Seria bueno que incluyas el error que te da la base. Por lo pronto te
adelanto algunos problemas:

1) no se declara una variable setof
2) el select lo recorres con for

en definitiva seria algo como:

CREATE or replace FUNCTION itinerario.info_geocerca(geometry) RETURNS setof
public.calles AS '
DECLARE
geocerca alias for $1;
captura_comuna integer;
captura_datos record;
BEGIN
for captura_comuna in select id from public.comunas
where Intersects(the_geom,geocerca)
loop
select INTO captura_datos * from calles
where comuna=captura_comuna.comuna;
RETURN NEXT captura_datos;
END loop;
IF NOT FOUND THEN
RAISE INFO ''Punto de Referencia fuera de Area.'';
RETURN ''0'';
END IF;

RETURN;

' LANGUAGE plpgsql;

creo.. si te da error avisa. con el error incluido

atentamente,
Jaime Casanova

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Roberto Cesar Najera 2005-02-18 08:40:38 Replicacion
Previous Message Jaime Casanova 2005-02-17 21:29:28 Re: tabla temporal