Доброе время суток!
В БД среди прочего имеется два типа таблиц:
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 читать будем?
http://postgresql.ru.net/docs/extented_FAQ.html#Q003
спасибо, честно говоря, не
спасибо, честно говоря 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 млн. строк. Если перебирать по одному коду как в функции- боюсь слишком замедлится. Плюс есть разные таблицы соответствий - получается, по каждой из них надо свою функцию писать.