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 :

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;
Et lorsque j'exécute le select * from essai(), il me renvoie un tableau vide avec seulement le nom des colonnes.

Pour le deuxième cas, j'écris la requête à l'extérieur des boucles, comme suit :

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

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.