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 04/03/2014 10:40:32

Geo-x
Membre

Création d'une boucle avec variable

Bonjour @ tous.

J'essaie de créer une fonction qui me permettra de renvoyer un tableau au format HTML (sans passer par du PHP).

Je demande donc en entrée 5 champs (parce que c'est ce dont j'ai besoin) et 1 table

CREATE OR REPLACE FUNCTION sortie_tableau_html5(c1 varchar,c2 varchar,c3 varchar,c4 varchar,c5 varchar,var_table varchar)

Ensuite je déclare une variable qui contiendra le code HTML

DECLARE var_tableau_html varchar;

Et un record qui me servira plus tard

DECLARE var_titre_tableau record;

Ensuite, je commence à structurer mon tableau en indiquant les titres des colonnes

var_tableau_html='<TABLE BORDER="0"><TR><TH>'||c1||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c2||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c3||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c4||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c5||'</TH></TR><TR>';

Mais après ça se complique...Quand je veux faire une boucle sur le résultat de ma requête qui remplira le tableau. Je fais une boucle

FOR var_titre_tableau IN EXECUTE 'SELECT DISTINCT '||c1||','||c2||','||c3||','||c4||','||c5||' FROM '||var_table 
LOOP
var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c1||'</TD>';
var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c2||'</TD>';
var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c3||'</TD>';
var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c4||'</TD>';
var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c5||'</TD>';
END LOOP;

Puis je ferme mon tableau que je renvoie

var_tableau_html=var_tableau_html||'</TR></TABLE>';
return var_tableau_html;

Le problème, c'est que la boucle ne fonctionne pas, je n'arrive pas à faire interpréter à ma fonction une grille de lecture sur le résultat de ma requête

ERROR:  record "var_titre_tableau" has no field "c2"

J'ai essayé différents stratagèmes :

1- Créer ma requête en amont et exécuter après le IN
2- Créer plutôt dans ma boucle une requête du type

EXECUTE var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c1||'</TD>';

Mais rien n'y fait, ça ne fonctionne pas...

Z'auriez une explication par hasard ? ;-)

Geo-x

Hors ligne

#2 04/03/2014 10:47:31

rjuju
Administrateur

Re : Création d'une boucle avec variable

Bonjour,

Vous pouvez construire la partie html directement dans la requête, et remplacer le record par une simple variable text :

FOR v_text IN EXECUTE 'SELECT DISTINCT <td>' || c1 || '</td><td>' || ...

Hors ligne

#3 04/03/2014 11:39:57

Geo-x
Membre

Re : Création d'une boucle avec variable

Merci rjuju, ça c'est ce que j 'appel de la réactivité !!

Voici le code final de la fonction qui permet, pour rappel, de générer un tableau HTML à partir de 5 champ et 1 table en entrée :

CREATE OR REPLACE FUNCTION sortie_tableau_html5(c1 varchar,c2 varchar,c3 varchar,c4 varchar,c5 varchar,var_table varchar)
RETURNS varchar AS
$BODY$
DECLARE
var_tableau_html varchar;
var_text text;
BEGIN

BEGIN

var_tableau_html='<TABLE BORDER="0"><TR align="center">><TH>'||c1||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c2||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c3||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c4||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c5||'</TH></TR>';

raise notice 'var_tableau_html : %',  var_tableau_html;

FOR v_text IN EXECUTE 'SELECT DISTINCT ''<TR align="center"><td>''||'||c1||'||''</td><td>''||'||c2||'||''</td><td>''||'||c3||'||''</td><td>''||'||c4||'||''</td><td>''||'||c5||'||''</td></TR>'' FROM '||var_table
LOOP

var_tableau_html=var_tableau_html||v_text;

raise notice 'var_tableau_html : %',  var_tableau_html;

END LOOP;

var_tableau_html=var_tableau_html||'</TABLE>';
return var_tableau_html;

END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

Question subsidiaire, est-il possible de compter le nombre de colonnes issues d'une requête, par exemple, d'un SELECT * ?

A très vite.

Geo-x

Dernière modification par Geo-x (04/03/2014 11:43:45)

Hors ligne

#4 04/03/2014 21:10:18

gleu
Administrateur

Re : Création d'une boucle avec variable

Non, pas avec PL/pgsql.


Guillaume.

Hors ligne

Pied de page des forums