Функция с запросом из таблицы, указанной в переменной.

Доброго всем времени суток!

Подскажите, есть ли возможность создать функцию с переменными:
1. Имя таблицы, из которой необходимо сделать запрос;
2. входящие значения(например id > 100);
3. исходящие, т.е., например, имя колонки в запросе;

что-то типа такого:
CREATE OR REPLACE FUNCTION test(tabl_name varchar, field_in varchar, field_out varchar)
...
SELECT $3 FROM $1 WHERE $2>100;
...

т.е. объединить два запроса:
1.
SELECT * FROM test() AS (id int,code varchar);

2.

CREATE OR REPLACE FUNCTION test(tabl_name varchar)
 RETURNS SETOF RECORDS AS
$BODY$
DECLARE
r record;
BEGIN
FOR r IN SELECT id,code FROM products LOOP
RETURN next r;
END LOOP;
RETURN;
END;
$BODY$
LANGUAGE plpgsql;

чтобы можно было вместо products использовать переменную tabl_name
и не объявлять все колонки в запросе ( ... as (id int,code varchar)... )

Есть ли подобный рабочий вариант в природе?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

postgresql.ru.net/docs/extent

postgresql.ru.net/docs/extented_FAQ.html#Q003
postgresql.ru.net/docs/extented_FAQ.html#Q004
Обходной путь - используйте EXECUTE

Можно , но неэффективно

Такая процедура будет каждый раз делать prepare, пересчитывать план и будет крайне неэффективной, т.е. смысл ХП теряется как таковой.
Обычно такое нужно, если неверно спроектирована БД :(
Реализовать можно например так, но при условии, что все поля присутствуют в таблице table_name:

CREATE OR REPLACE FUNCTION test.dynamic (
  table_name varchar
)
RETURNS TABLE (
  id bigint,
  name varchar
) AS
$body$
DECLARE
	sql varchar;
BEGIN
	sql:='select id, name from ' || table_name;  
    FOR id, name
    IN  execute sql 
    loop
		RETURN next;
	end loop;
END;
$body$
LANGUAGE 'plpgsql'

Всем спасибо!

Всем спасибо! Придётся плодить функции...

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

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