Добрый день. Подскажите плиз ...
Есть таблица classif со столбцами:
... , group1, group2, group3, ... , group48, ...
В функции делаю запрос и хочу пробежаться по курсору этой таблицы и , скажем, обработать значение полей с group1 по group20 особым образом. делаю:
OPEN curs FOR SELECT * FROM classif; loop fetch curs INTO tmprec; exit when NOT found; FOR I IN 1..20 loop -- проблема в строке ниже, я не могу динамически подставить -- значение нужного мне поля в зависимости от i. -- она синтаксически неверна value := tmprec.GROUP{I}; ... ...обработка ... end loop; end loop;
Приходиться вручную указывать и обрабатывать каждое значение без цикла, что то типа:
value := tmprec.group1;
...
value := tmprec.group2;
...
value := tmprec.group2;
...
value := tmprec.group4;
...
и так для каждого столбца.
Подскажите как бы динамически это сделать в цикле в зависимости от I?
что то вроде
value := tmprec.group{I};
Что то в доках не нашел ничего по этому вопросу.
Заранее спасибо.
Сходная тема
Сходная тема обсуждалась уже здесь на форуме.
Потворюсь, что написал тогда:
Любая хранимая процедура (т.е. функция) хранится в скомпилированном виде. Процесс компиляции разумеется включает в себя все необходимые проверки синтаксисиов и типов. А теперь внимание вопрос:
Каким образом можно проверить соответствие типов, если на момент компиляции тип столбца в вашей таблице неизвестен? Опять же чтобы задействовать value в данном выше примере, для начало надо для него выполнить declare. На какой тип будете выполнять declare, если например group1 у вас integer, а group2 varchar? А PostgreSQL до тех пор пока не выполнил УЖЕ В ПРОЦЕССЕ работы вашей функции желаемую вами подстановку group{I} не будет знать какого типа у вас столбец! Именно эти соображения делают невозможным такие конструкции.
я-таки кое-что
я-таки кое-что придумал на эту тему.. и даже поместил в блоге
Конечно для перебора полей в запросе надо создавать временную таблицу и ковыряться в ней