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 |
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 |