Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#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

 

Pied de page des forums

Powered by FluxBB