Bonjour à tous !!!
Je suis nouveau sur ce forum ainsi que dans la programmation en pl/pgsql.
Je viens requérir votre aide, parce que je n'arrive pas à trouver ce que je ne fais pas bien dans mon code.
Mon but, comme l'indique le titre est de modifier une table par l'utilisation de boucles, d'où le choix de pl/pgsql.
J'ai une table attributaire (290 lignes) qui renseigne des tronçons hydrographiques sur ma zone d'étude. Elle est composée de plusieurs colonnes, dont une nommée "pkhexut". Cette colonne a la particularité de contenir 90 lignes avec la valeur 1000000. Je veux donc, par l'utilisation de boucles dans pl/pgsql, modifier ma table initiale pour qu'elle n'affiche plus que les 90 dites lignes. Je sais qu'avec une simple requête SQL, je peux avoir ce résultat très rapidement, mais je veux absolument le faire par l'intermédiaire de boucles, puisque je vais être amené à utiliser ces traitements afin d'effectuer des actions plus complexes qui les nécessitent.
Ainsi, j'arrive sur deux cas. Pour le premier, j'écris la requête à l'intérieur de la boucle du FOREACH, comme suit :
Et lorsque j'exécute le select * from essai(), il me renvoie un tableau vide avec seulement le nom des colonnes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 CREATE OR REPLACE FUNCTION essai() RETURNS TABLE (ess_gid int, id_nd_ini cours_d_eau_par_noeuds_hydro_2.id_nd_ini%TYPE, id_nd_fin cours_d_eau_par_noeuds_hydro_2.id_nd_fin%TYPE, geom cours_d_eau_par_noeuds_hydro_2.geom%TYPE, pkhexut cours_d_eau_par_noeuds_hydro_2.pkhexut%TYPE) AS $BODY$ DECLARE pkhexut cours_d_eau_par_noeuds_hydro_2.pkhexut%TYPE; pkhtest numeric :=1000000; BEGIN IF (pkhexut is NOT NULL) THEN FOREACH pkhtest in ARRAY pkhexut LOOP RETURN QUERY SELECT row_number()OVER()::integer AS ess_gid, conh.id_nd_ini, conh.id_nd_fin, conh.geom, conh.pkhexut FROM cours_d_eau_par_noeuds_hydro_2 as conh ORDER BY ess_gid; END LOOP; END IF; END; $BODY$ LANGUAGE plpgsql;
Pour le deuxième cas, j'écris la requête à l'extérieur des boucles, comme suit :
Et là, lorsque j'exécute select * from essai(), il me renvoie un tableau avec tous les noms des colonnes, mais avec toutes les lignes de la table "cours_d_eau_par_noeuds_hydro_2" alors que je ne lui ai demandé que les lignes où les valeurs de la colonne "pkhexut" sont égales à 1000000. Du coup, il me renvoie un tableau à 279 lignes au lieu d'un tableau à 90 lignes...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 CREATE OR REPLACE FUNCTION essai() RETURNS TABLE (ess_gid int, id_nd_ini cours_d_eau_par_noeuds_hydro_2.id_nd_ini%TYPE, id_nd_fin cours_d_eau_par_noeuds_hydro_2.id_nd_fin%TYPE, geom cours_d_eau_par_noeuds_hydro_2.geom%TYPE, pkhexut cours_d_eau_par_noeuds_hydro_2.pkhexut%TYPE) AS $BODY$ DECLARE pkhexut cours_d_eau_par_noeuds_hydro_2.pkhexut%TYPE; pkhtest numeric :=1000000; BEGIN IF (pkhexut is NOT NULL) THEN FOREACH pkhtest in ARRAY pkhexut LOOP END LOOP; END IF; RETURN QUERY SELECT row_number()OVER()::integer AS ess_gid, conh.id_nd_ini, conh.id_nd_fin, conh.geom, conh.pkhexut FROM cours_d_eau_par_noeuds_hydro_2 as conh ORDER BY ess_gid; END; $BODY$ LANGUAGE plpgsql;
J'ai vraiment besoin de savoir comment modifier une table avec des boucles, même pour ce cas simple que je pourrais résoudre dans une simple requête SQL en rajoutant une ligne : WHERE conh.pkhexut=1000000. Mais c'est pour, plus tard, effectuer des traitements complexes qui exigent l'intervention de boucles. Ainsi, si je sais comment modifier une table avec des boucles simples, j'aurais des pistes pour le faire avec des boucles complexes.
Je vous remercie d'avance pour vos futures réponses.
Partager