IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

[9.3] Modifier une table par une boucle


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2014
    Messages : 28
    Par défaut [9.3] Modifier une table par une boucle
    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.

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2014
    Messages : 28
    Par défaut
    Ca y est !!!

    J'ai trouvé la réponse à mon problème ! Et tout seul en plus. J'ai parcouru des dizaines de forums, de cours et de tuto en français et en anglais et j'ai enfin trouvé comment modifier une table par des boucles !!!

    Voici le script :

    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
    	tables record;
    	BEGIN
    	FOR tables IN (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) LOOP
    		ess_gid := tables.ess_gid ; id_nd_ini := tables.id_nd_ini ; id_nd_fin := tables.id_nd_fin ;
    		geom := tables.geom ; pkhexut := tables.pkhexut ;
    		If pkhexut = 1000000 then
    		RETURN NEXT;
    		END IF;
    		END LOOP;
    	END;
    	$BODY$
    LANGUAGE plpgsql;
    Et là, ça me retourne le tableau avec les colonnes que je lui demande et les 90 lignes correspondant à la valeur 1000000 de la colonne pkhexut.


    Bon, maintenant il me reste à faire les traitements complexes qu'impliquent mon projet... Et ce sera bien ça le plus dur !
    Je posterai d'ailleurs sûrement dans le futur, ou peut-être pas.

    A bientôt !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  2. Réponses: 13
    Dernier message: 28/06/2010, 14h35
  3. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50
  4. Réponses: 4
    Dernier message: 31/10/2007, 20h27
  5. Réponses: 2
    Dernier message: 29/03/2007, 11h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo