私が知っている魔法の関数はありません。つまり、標準の Postgres にはおそらくそのようなものはありません。
情報スキーマまたはカタログ テーブルは、この例のアドホックな行タイプでは役に立ちません。しかし、おそらく、登録された行タイプを使用し、このルートを提供するtableでこれを行うことを検討しているでしょう:
WITH x AS (SELECT 'mytable'::regclass AS tbl)
SELECT 'SELECT '
|| string_agg(format('array_agg(%I) AS %1$I_arr', a.attname), E'\n ,')
|| E'\nFROM ' || tbl
FROM x
JOIN pg_attribute a ON a.attrelid = x.tbl
WHERE NOT a.attisdropped -- no dropped (dead) columns
AND a.attnum > 0 -- no system columns (you may or may not want this)
GROUP BY x.tbl
これにより、適切な SQL ステートメントが動的に生成されます。
テーブル名を to にキャストregclass
すると、SQL インジェクションに対して安全になります。この関連する回答の詳細な説明:
PostgreSQL 関数パラメーターとしてのテーブル名
結果:
SELECT array_agg(col1) AS col1_arr
,array_agg("illegal nAmE") AS "illegal nAmE_arr"
, ...
FROM mytable
戻り値の型も動的であるため、関数内で動的 SQL を使用して完全に自動化することは容易ではありません。カーソルを作成して返すこともできますが、それはおそらくやり過ぎです。