PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 21/02/2012 15:33:58

Geo-x
Membre

Utilisation d'un RECORD dans un trigger

Bonjour @ tous,

je n'ai pas trouvé la réponse à ma question dans les sujets existant, je me penche donc vers vous.

Voici le problème :

J'utilise l'extension postgis. J'essaie de mettre en place un trigger, qui :

1- J'ai une succession de troncons sur une route avec un ID/troncon (TABLE 2)
2- Je dessine une ligne à cheval sur 2/3/3/4... troncons (TABLE 1)
3- Le trigger entre en jeu, et récupére l'ID des 2/3/4... troncons et je l'intègre dans un champ idtroncon1/idtroncon2/idtroncon3/idtroncon4... (TABLE 1)

Voici mon trigger actuel :

CREATE OR REPLACE FUNCTION touches_test()
RETURNS trigger AS
$BODY$

DECLARE troncon record;
BEGIN

	SELECT DISTINCT materiau_cana INTO troncon FROM test_sdf WHERE ST_Overlaps (NEW.wkb_geometry1,test_sdf.wkb_geometry)=TRUE;
	
	NEW.modif=troncon;    ----Et là, la question qui, tue, comment je récupère ce qui se trouve dans mon record???
	NEW.modif2=troncon;

  RETURN NEW;
  
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
ALTER FUNCTION touches_test() OWNER TO postgres;

Au cas ou vous auriez loupé la question caché dans le code :

Et là, la question qui, tue, comment je récupère ce qui se trouve dans mon record???

Merci d'avance!

Geo-x

Hors ligne

#2 21/02/2012 15:44:36

rjuju
Administrateur

Re : Utilisation d'un RECORD dans un trigger

Bonjour.

Vous pouvez utiliser troncon.nom_champ pour accéder aux différents champs du record.
Mais si la requête renvoie plus d'un enregistrement ça devrait poser soucis.

Hors ligne

#3 21/02/2012 15:45:47

Geo-x
Membre

Re : Utilisation d'un RECORD dans un trigger

Et oui peut être faut-il que je mette en place un count suivit d'un LOOP?

Hors ligne

#4 21/02/2012 15:51:22

rjuju
Administrateur

Re : Utilisation d'un RECORD dans un trigger

Cela dépend de ce que vous voulez faire, gérer spécifiquement chacune des lignes ou gérer le fait qu'il y ai au moins une ligne trouvée ?

Un record ne contient par définition qu'un seul enregistrement. Il faut utiliser un curseur pour pouvoir gérer un ensemble d'enregistrement.

Hors ligne

#5 21/02/2012 15:52:43

Geo-x
Membre

Re : Utilisation d'un RECORD dans un trigger

Chaque ID de troncon doit être séparé pour pouvoir les traiter derrière. Je n'ai jamais utilisé de curseur dans un trigger je vais regarder comment faire et je reviens pour vous tenir au courant.

Hors ligne

#6 22/02/2012 23:55:04

geoetl
Membre

Re : Utilisation d'un RECORD dans un trigger

essayons de comprendre le sujet...

1- J'ai une succession de troncons sur une route avec un ID/troncon (table 2)

//donc cette table 2 contient des troncons avec un id ok.
la notion de route on s'en moque semble t il  ( simple regroupement de troncon successif)



2- Je dessine une ligne à cheval sur 2/3/3/4... troncons (TABLE 1)

alors... tu dessine un ligne dans la table 1 et cette ligne couperait X troncon....
si c'est ca alors tu dessinerais une ligne en zig-zag et cette ligne couperait ici 1 foi le T2, deux fois le T3, une foi le T4 etc...
bizard mais continuons

3- Le trigger entre en jeu, et récupére l'ID des 2/3/4... troncons et je l'intègre dans un champ idtroncon1/idtroncon2/idtroncon3/idtroncon4...

je dirais plutot que : la ligne coupe tes troncons, tu chercherais donc a recuperer les valeurs des 4 intersections (ce que ne fait pas ton trigger...),
tu peux grouper et compter puisqu'il y a deux foi le troncon n°3 qui est intersecté, tu recupere dans ton example les 3 lignes suivantes

id_dessin : id_troncon : nbdechevauchement
ligne dessiné : coupe t2 : 1 foi
ligne dessiné : coupe t3 : 2 foi
ligne dessiné : coupe t4 : 1 foi

donc ton resultat est a stocker dans une table de relation entre table1 et table 2, cette table contient 2 colonnes qui forment une PK_double (id_dessin+ id_troncon), chacun etant une FK de table 1 et table 2. quant au champ nbdechevauchement, libre a toi de le mettre ou pas.

donc tu obtiens 4 lignes suite a l'intersection ( disons 3 lignes si y'a un group by sur tronçon)
donc ton trigger doit boucler sur ces 3 lignes pour les inserer dans la table de relation :

---------------------

DECLARE meschevauchement RECORD;


FOR meschevauchement  IN
     SELECT blabla bla WHERE ST_intersect (NEW.wkb_geometry1, test_sdf.wkb_geometry) group by blabla...
     LOOP

              insert into table_de_realtion values (id_dessin, id_troncon, nbchevauchement)
              ou alors c'est EXECUTE 'INSERT INTO '  je sais plus..........

     END LOOP;

etc.....

va voir le loop ici par exemple :
http://www.postgresql.org/docs/8.3/inte … URES-LOOPS

bye,
Julien

------------

Hors ligne

#7 27/02/2012 17:42:58

Geo-x
Membre

Re : Utilisation d'un RECORD dans un trigger

Merci Julien pour la réponse,

Le besoin a finalement été modifié, je n'utiliserais donc pas forcément cet code là (cette fois-ci).

Pour info finalement on m'a demande de concaténer l’ensemble des résultat dans un seul champ texte ça donne quelque chose du genre :

SELECT array_to_string(array_agg(id_troncon),' / ') AS id_troncon,COUNT(*) AS nb_id_troncon INTO variable FROM
(SELECT id_troncon FROM diag_route WHERE ST_Overlaps (NEW.wkb_geometry,diag_route.wkb_geometry)=TRUE OR ST_Contains (NEW.wkb_geometry,diag_route.wkb_geometry)=TRUE);
		
NEW.troncon_trav=variable.id_troncon;
NEW.nb_troncon_trav=variable.nb_id_troncon;

A bientôt et merci pour votre aide!

Hors ligne

#8 15/05/2012 11:59:32

Geo-x
Membre

Re : Utilisation d'un RECORD dans un trigger

@geoetl

Finalement tout le code que vous m'avez donné lors de votre dernier post a finit par me servir sur une toutes autre base et je vous en remercie.

Pour information, il ne faut pas faire EXECUTE avant un insert into dans ce cas là ;-)

Encore merci.

Geo-x

Hors ligne

Pied de page des forums