функция, возвращающая таблицу

Доброе время суток!
В БД среди прочего имеется два типа таблиц:
tbl_typeA (prdate date, code1 integer, data real) (таких несколько сотен объединенных в десяток групп)
tbl_typeB (код1, код2) - используется для перекодирования из кода1 в код2 (их несколько десятков - по этим таблицам и образуются группы таблиц tbl_typeA)
В БД часто формируются запросы вида:
select tbl_typeA.дата, tbl_typeB.код2, tbl_typeA, данные
from
tbl_typeA inner join tbl_typeB
on tbl_typeA.код1=tbl_typeB.код2;
В связи с очень частым использованием подобных запросов возникла мысль сделать функцию-перекодировщик, которая по 2-м параметрам в виде 1) перекодируемой таблицы tbl_typeA и 2) таблицы сопоставления кодов tbl_typeB будет возвращать результат в виде представленного выше запроса. Поскольку опыта создания функций почти нет моя пробная функция возвращает ошибку. Вот функция:
tbl_name - таблица типа А, tbl_sootv - таблица сопоставления кодов, тип B.
CREATE OR REPLACE FUNCTION tbl_decoder(tbl_name varchar, tbl_sootv varchar)
RETURNS table (prdate date, code2 integer, data numeric(8,2)) AS
$BODY$
select tbl_name.prdate, tbl_sootv.code2, tbl_name.data
from tbl_name inner join tbl_sootv
on tbl_name.code1=tbl_name.code2;
$BODY$
LANGUAGE SQL;

ошибка:
relation "tbl_name" does not exist

В качестве параметра я пытаюсь передать наименования таблиц. Однако, судя по сообщению ошибки, в запрос не вставляются наименования таблиц. Каким образом можно решить проблему? Возможно я ошибаюсь, но насколько я понял, передать в качестве параметров сами таблицы не удастся.

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

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

FAQ читать будем?

спасибо, честно говоря, не

спасибо, честно говоря faq не видел раньше (потому что не искал, наверное). Вообще я как раз и пришел только что к этому выводу почитав документацию. Однако все таки. Зная заранее структуру таблиц, типов данных (они одинаковы у таблиц одного типа), наличие заданной таблицы в БД, а так же то, что она однозначно содержит данные (не пуста). Можно ли найти выход из ситуации?

Есть обходной путь, юзайте

Есть обходной путь, юзайте EXECUTE, например
http://postgresql.ru.net/node/127707

спасибо за подсказку - буду

спасибо за подсказку - буду пробовать

В данном случае IMHO

В данном случае IMHO эффективнее будет

select prdate, sootv(code1) as code2 , data
from tbl_typeA

create function sootv(integer) returns integer as $$
select code2 from tbl_typeB where code1 = $1;
$$ language sql;

таблица на 1,5 млн. строк.

таблица на 1,5 млн. строк. Если перебирать по одному коду как в функции- боюсь слишком замедлится. Плюс есть разные таблицы соответствий - получается, по каждой из них надо свою функцию писать.

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

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

Back to top

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