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 11/06/2015 15:53:41

guil31
Membre

pb de syntaxe boucle sur une selection

Bonjour,


Je fais mes premières armes en plpgsql et j'ai un problème de syntaxe.
Je souhaite faire une boucle sur les résultats d'une sélection mais dans cette sélection le nom de la table est en fait un paramètre de ma fonction.

En gros je souhaite écrire quelque chose qui ressemble à ca:

CREATE OR REPLACE FUNCTION ma_fonction(ma_table text)  AS $BODY$
   DECLARE
      c1 text;
      c2 text;
      ....
   BEGIN
      ....
      FOR x in (SELECT champ_1, champ_2 FROM ma_table)
      LOOP
         c1 = x.champ_1;
         c2 = x.champ_2; 
         ....
      END LOOP;

    END;
$BODY$
LANGUAGE 'plpgsql';

Mais le 'ma_table' dans le FOR x ne passe pas.
(Par contre si je mets le nom de la table en dur c'est ok)


Merci pour votre aide

Hors ligne

#2 11/06/2015 17:55:05

rjuju
Administrateur

Re : pb de syntaxe boucle sur une selection

Regardez http://docs.postgresql.fr/9.4/plpgsql-c … tures.html , et plus particulièrement 40.6.4. Boucler dans les résultats de requêtes.

Hors ligne

#3 12/06/2015 09:36:26

guil31
Membre

Re : pb de syntaxe boucle sur une selection

Merci (j'étais allé sur cette page mais je l'avais certainement passé trop vite)
Bref: voici le code correspondant à la solution trouvée

CREATE OR REPLACE FUNCTION ma_fonction(ma_table text)  AS $BODY$
   DECLARE
      c1 text;
      c2 text;
      ....
   BEGIN
      ....
      FOR x in EXECUTE '(SELECT champ_1, champ_2 FROM ' || ma_table || ')'
      LOOP
         c1 = x.champ_1;
         c2 = x.champ_2; 
         ....
      END LOOP;

    END;
$BODY$
LANGUAGE 'plpgsql';

Hors ligne

#4 12/06/2015 10:53:23

gleu
Administrateur

Re : pb de syntaxe boucle sur une selection

Pensez à utiliser quote_ident pour éviter tout problème d'injection SQL du type :

SELECT ma_fonction($$une_table; DROP TABLE x;$$);

Guillaume.

Hors ligne

Pied de page des forums