#1 Sun 21 March 2010 12:14
- yteb
- Participant occasionnel
- Date d'inscription: 25 Jun 2007
- Messages: 22
Fonction postgres avec update dans boucle
Bonjour a tous,
Je commence un peu a :cry: en ce dimanche normalement pepere car je suis bloqué sur une fonction que j'essaye de modifier depuis pas mal de temps sans succes...Je suis novice avec les fonctions postgres et la solution est peut etre des plus simples donc avis aux ames charitables pour me sortir de la panade...
Voici la fonction que j'utilise (fonction de pgrouting que j'ai modifie pour lire plusieurs origine destination dans une table)
Code:
DECLARE r record; path_result record; v_id integer; e_id integer; geom geoms; id integer; t record; BEGIN id :=0; FOR t IN SELECT * FROM tmp_od_primaire LOOP FOR path_result IN EXECUTE 'SELECT gid,the_geom FROM ' || 'shortest_path(''SELECT gid as id, source::integer, target::integer, ' || 'length::double precision as cost FROM ' || quote_ident(geom_table) || ''', ' || t.id_o || ' , ' || t.id_d || ' , false, false), ' || quote_ident(geom_table) || ' where id_section = gid ' LOOP geom.gid := path_result.gid; geom.the_geom := path_result.the_geom; id := id+1; geom.id := id; RETURN NEXT geom; END LOOP; END LOOP; RETURN; END;
J'appelle cette fonction dans la requete suivante
Code:
/*CREATION DE LA TABLE RESULTAT OK*/ CREATE TABLE dijsktra_result(gid int4) with oids; SELECT AddGeometryColumn('dijsktra_result', 'the_geom', '3947', 'MULTILINESTRING', 2); INSERT INTO dijsktra_result (the_geom) SELECT the_geom FROM dijkstra_sp('vue_section', 52, 35);
Cette premiere etape marche nickel...Seulement j'essaye de recuperer les identifiant origine et destination dans la table resultat afin de pouvoir les separer et leur appliquer des traitement. Mais horreur, j'arrive toujours au meme resultat, a savoir la colonnes geometry remplie correctement mais les autres vides.
Pour info, j'essaye simplement d'integrer dans ma boucle un update id_o et id_d afin de recuperer les origines destination de chaque section de rue traitee avec un truc style UPDATE en fin mais il me plante :
Fonction modifiee qui plante :
Code:
DECLARE r record; path_result record; v_id integer; e_id integer; geom geoms; id integer; t record; BEGIN id :=0; FOR t IN SELECT * FROM tmp_od_primaire LOOP FOR path_result IN EXECUTE 'SELECT gid,the_geom FROM ' || 'shortest_path(''SELECT gid as id, source::integer, target::integer, ' || 'length::double precision as cost FROM ' || quote_ident(geom_table) || ''', ' || t.id_o || ' , ' || t.id_d || ' , false, false), ' || quote_ident(geom_table) || ' where id_section = gid ' LOOP geom.gid := path_result.gid; geom.the_geom := path_result.the_geom; id := id+1; geom.id := id; RETURN NEXT geom; END LOOP; UPDATE dijsktra_result SET id_or=id_o FROM tmp_od_primaire WHERE id_or IS NULL; UPDATE dijsktra_result SET id_dr=id_d FROM tmp_od_primaire WHERE id_or IS NULL; END LOOP; RETURN; END;
Personne n'aurait une petite idee svp?
Hors ligne