URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5409
[ Назад ]

Исходное сообщение
"Имя таблицы, как аргумент функции"

Отправлено vlad , 10-Май-06 12:14 
Есть проблема: надо создать функцию для работы с таблицами, у которой аргумент - имя таблицы, с которой она должна работать. Но PostgreSQL не раскрывает подстановки типа SELECT что-нибудь FROM $1 (или имя переменной). Не подскажет ли кто-нибудь решение?

Содержание

Сообщения в этом обсуждении
"Имя таблицы, как аргумент функции"
Отправлено СергейК , 10-Май-06 15:36 
>Есть проблема: надо создать функцию для работы с таблицами, у которой аргумент
>- имя таблицы, с которой она должна работать. Но PostgreSQL не
>раскрывает подстановки типа SELECT что-нибудь FROM $1 (или имя переменной). Не
>подскажет ли кто-нибудь решение?

SQL-ную функцию такую не написать, но на PL/pgSQL можно.
Если достаточно чтобы функция возвращала одну запись, то можно использовать EXECUTE INTO внутри PL/pgSQL (см. http://www.postgresql.org/docs/8.1/static/plpgsql-statements... )

А если нужна Set Returning Function, то можно сделать с помощью курсоров (похоже на пример вот здесь http://www.postgresql.org/docs/8.1/static/plpgsql-cursors.ht... ). В функции надо сначала получить курсор на Ваш динамический запрос, а потом пройтись циклом по результатам из курсора.


"Имя таблицы, как аргумент функции"
Отправлено vlad , 12-Май-06 07:10 
Проблема решилась примерно так:
CREATE OR REPLACE FUNCTION test2(text)
RETURNS text AS
'
DECLARE
curs1 refcursor;
out_raw record;
BEGIN
OPEN curs1 FOR EXECUTE ''SELECT * FROM '' || quote_ident($1);
FETCH curs1 INTO out_raw;
CLOSE curs1;
RETURN out_raw.dir;
END;
'
LANGUAGE 'plpgsql';