Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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.
Julien.
https://rjuju.github.io/
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
Pages : 1