Я немного задремал в обед сидя на стуле, слово "невозможно" забылось и, как это обычно бывает у гениев , в оставленном без присмотра мозгу начали всплывать ответы на непоставленные вопросы.
Таким образом всплыла у меня идея (на удивление простая) перебора полей любой таблицы.
Итак, для начала пишем вспомогательную функцию, выдающую все столбцы конкретной таблицы
CREATE OR REPLACE FUNCTION "prod"."get_cols" (schema text, tabl text) RETURNS SETOF text AS $body$ declare col text; BEGIN FOR col IN execute 'select column_name from information_schema.columns '|| 'where table_schema='||quote_literal(schema)||' and table_name='||quote_literal(tabl) Loop RETURN next col; end loop; END; $body$ LANGUAGE 'plpgsql'
Что делать дальше, я думаю многие догадались, а кто не догадался - вот пример
CREATE OR REPLACE FUNCTION "prod"."test_func" (sh text, tabl text) RETURNS SETOF record AS $body$ declare col text; val text; rec record; BEGIN --ходим по столбцам первой записи таблицы (для примера) FOR col IN SELECT * FROM prod.get_cols(sh,tabl) loop execute 'select '|| quote_ident(col) || ' from '||quote_ident(sh)||'.'||quote_ident(tabl)|| ' limit 1' INTO val; SELECT col,val::text INTO rec ; RETURN next rec; end loop; end; $body$ LANGUAGE 'plpgsql'
ну и запускаем тест:
SELECT * FROM prod.test_func('public','Errors') AS txt(col "text", val text)
ЗЫ:
Если хочется ковыряться во временных таблицах, то имя своей временной схемы можно получить так
SELECT nspname AS my_temp_schema FROM pg_namespace WHERE oid=pg_my_temp_schema()