これは、列名に text[] 配列を使用して複数の列で動作する修正版です。また、出力をフォーマットするために新しい行とタブを出力します。
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;
次のような関数を呼び出します。
SELECT genhtml('public', 'tablenamehere', 'r', ARRAY['col1', 'col2', 'col3']);
「r」は通常のテーブル用です。代わりに VIEW を使用している場合は、'v' に変更します。