Перебор полей таблицы в функции

Я немного задремал в обед сидя на стуле, слово "невозможно" забылось и, как это обычно бывает у гениев :), в оставленном без присмотра мозгу начали всплывать ответы на непоставленные вопросы.

Таким образом всплыла у меня идея (на удивление простая) перебора полей любой таблицы.

Итак, для начала пишем вспомогательную функцию, выдающую все столбцы конкретной таблицы

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()

Back to top

(С) Виктор Вислобоков, 2008-2010