Voici une version modifiée qui fonctionne avec plusieurs colonnes en utilisant un tableau text[] pour les noms de colonnes. Elle imprime également de nouvelles lignes et des tabulations pour formater la sortie.
CREATE OR REPLACE FUNCTION genhtml(text, text, text, text[])
RETURNS text AS $BODY$
DECLARE
schemaname ALIAS FOR $1;
tablename ALIAS FOR $2;
tabletype ALIAS FOR $3;
columnnames ALIAS FOR $4;
result TEXT := '';
searchsql TEXT := '';
var_match TEXT := '';
col RECORD;
header TEXT;
BEGIN
header := E'\t' || '<tr>' || E'\n';
searchsql := $QUERY$SELECT ''$QUERY$;
FOR col IN SELECT attname
FROM pg_attribute AS a
JOIN pg_class AS c ON a.attrelid = c.oid
WHERE c.relname = tablename
AND n.nspname = schemaname
AND c.relkind = tabletype
AND attnum > 0
AND attname = ANY(columnnames)
LOOP
header := header || E'\t\t' || '<th>' || col || '</th>' || E'\n';
searchsql := searchsql || $QUERY$ || E'\n\t\t' || '<td>' || $QUERY$ || col || $QUERY$ || '</td>' $QUERY$;
END LOOP;
header := header || E'\t' || '</tr>' || E'\n';
searchsql := searchsql || ' FROM ' || schemaname || '.' || tablename;
result := '<table>' || E'\n';
result := result || header;
FOR var_match IN EXECUTE(searchsql) LOOP
IF result > '' THEN
result := result || E'\t' || '<tr>' || var_match || E'\n\t' || '</tr>' || E'\n';
END IF;
END LOOP;
result := result || '</table>' || E'\n';
RETURN result;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Appelez la fonction avec quelque chose comme :
SELECT genhtml('public', 'tablenamehere', 'r', ARRAY['col1', 'col2', 'col3']);
Le 'r' est pour les tables normales. Si vous utilisez une VIEW à la place, changez-le en 'v'.