Ayuda con función plpgsql, cursors, fetch into

From: Mauricio Mantilla <mauriciomantilla(at)cable(dot)net(dot)co>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Ayuda con función plpgsql, cursors, fetch into
Date: 2006-04-19 15:28:26
Message-ID: 001801c663c5$e76b16a0$988b76c8@unal40dd49d431
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Estoy realizando la siguiente función pero tengo un problema que no logro saber porque sucede.

Primero tengo la siguiente función que si esta funcionando bien.

CREATE OR REPLACE FUNCTION Cercanos(punto geometry,radio float, tipo varchar(1)) RETURNS refcursor AS $$
DECLARE
mycurs refcursor;
BEGIN
OPEN mycurs FOR SELECT id FROM taxi WHERE posicion && Expand(punto,100) AND Distance(punto,posicion) < radio AND tipo_taxi like tipo;
RETURN mycurs;
END;
$$ LANGUAGE plpgsql;

Luego la llamo dentro de esta otra función, con la cual tengo problemas

CREATE OR REPLACE FUNCTION Asignar(id_solicitud integer) RETURNS integer[] AS $$
DECLARE
curs1 refcursor;
taxi_id numeric;
punto geometry;
radio float;
asignados integer[];
tipotax varchar(1);
i integer;
BEGIN
SELECT posicion,tipo INTO punto,tipotax FROM solicitud WHERE id_solicitud=id;
radio :=0.002;
WHILE (SELECT id FROM taxi WHERE estado = 'x' LIMIT 1) is null AND radio < 1 LOOP
radio := radio + 0.002;
END LOOP;
RAISE NOTICE 'radio %', radio;
curs1 := cercanos(punto, radio, tipotax);
i:=0;
LOOP
FETCH curs1 INTO taxi_id;
EXIT WHEN NOT FOUND;
i:=i+1;
asignados[i] := taxi_id;
END LOOP;
CLOSE curs1;
RETURN asignados;
END;
$$ LANGUAGE 'plpgsql';

Cuando realizo la función Asignar debería retornar el siguiente arreglo {1,3}
Sin embargo retorna algo como {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3}
Pero cuando realizo unicamente la función cercanos,el cursor que obtengo si tiene unicamente los valores 1 y 3, una sola vez, lo cual es logico porque la colmuna id en la tabla taxi es unica.

También intente solucionar el problema tratando de impedir que retorne 1 mas de una vez consecutiva:

CREATE OR REPLACE FUNCTION Asignar(id_solicitud integer) RETURNS integer[] AS $$
DECLARE
curs1 refcursor;
taxi_id numeric;
punto geometry;
radio float;
asignados integer[];
tipotax varchar(1);
i integer;
BEGIN
SELECT posicion,tipo INTO punto,tipotax FROM solicitud WHERE id_solicitud=id;
radio :=0.002;
WHILE (SELECT id FROM taxi WHERE estado = 'x' LIMIT 1) is null AND radio < 1 LOOP
radio := radio + 0.002;
END LOOP;
RAISE NOTICE 'radio %', radio;
curs1 := cercanos(punto, radio, tipotax);
i:=0;
LOOP
FETCH curs1 INTO taxi_id;
EXIT WHEN NOT FOUND;
CONTINUE WHEN asignados[i] = taxi_id;
i:=i+1;
asignados[i] := taxi_id;
END LOOP;
CLOSE curs1;
RETURN asignados;
END;
$$ LANGUAGE 'plpgsql';

En este caso la función retorna algo asi: {1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3}

Si alguien tiene idea de como solucionar este problema, acepto cualquier sugerencia.
Gracias

Attachment Content-Type Size
unknown_filename text/plain 144 bytes

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Miguel Angel 2006-04-19 18:13:39 Debo usar Transacciones?
Previous Message Zulima 2006-04-19 14:36:00 Re: [pgsql-es-ayuda] RE: [pgsql-es-ayuda] Réplica de TABLA