powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Динамически пройтись по столбцам таблицы в функции ... Как?
6 сообщений из 6, страница 1 из 1
Динамически пройтись по столбцам таблицы в функции ... Как?
    #35718235
ivanmara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Подскажите плиз ...
Есть таблица classif со столбцами:
... , group1, group2, group3, ... , group48, ...

В функции делаю запрос и хочу пробежаться по курсору этой таблицы и , скажем, обработать значение полей с group1 по group20 особым образом. делаю:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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};
Что то в доках не нашел ничего по этому вопросу.
Заранее спасибо.
...
Рейтинг: 0 / 0
Динамически пройтись по столбцам таблицы в функции ... Как?
    #35718688
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanmara,

plpython, plperl, plruby, pllua, pllua-classic
...
Рейтинг: 0 / 0
Динамически пройтись по столбцам таблицы в функции ... Как?
    #35718823
ivanmara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пришлось строить для каждого group{i} запрос динамически в вытягивать значения из столбца что то вроде:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
         OPEN curs FOR select * from classif;
         loop
            fetch curs into tmprec;
            exit when not found;

            for i in  1  ..  20  loop
    	          execute 'select group' || i || ' from classif where id = ' || id into value;
             -- обработка 
             ....
 	     end loop;
        end loop;

Понятное дело не производительно но похоже другого решения нет ...
...
Рейтинг: 0 / 0
Динамически пройтись по столбцам таблицы в функции ... Как?
    #35718845
ДБ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanmara,
Можно дождаться следующей версии постгреса. Там, вроде как, собираются сделать возможность работать со списком полей переменной типа RECORD в plpgSQL'е.
...
Рейтинг: 0 / 0
Динамически пройтись по столбцам таблицы в функции ... Как?
    #35720949
ivanmara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё один вариант более производительный. С использованием конструкции ARRAY:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
declare
 -- const
 table_name   	 varchar = 'classif';
 group_colomn 	 varchar = 'group';
 level           integer =  20 ;  

 tmprec          record;
 tmp_sql         varchar;
 tmp_sql2        varchar;
 i                  integer;
...
begin 
...
-- динамически строим запрос вида: select id, array[group1, group2, ..., group(I)] as group from classif order by group1, group2, ..., group(I)
    tmp_sql  := 'select id, array[';
    tmp_sql2 := ' order by ';
    for tmp_int in  1  .. level loop
       tmp_sql := tmp_sql || group_colomn || tmp_int;
       tmp_sql2 := tmp_sql2 || group_colomn || tmp_int;
        if tmp_int <> level then
        	tmp_sql := tmp_sql  || ', ';
               tmp_sql2 := tmp_sql2 || ', ';
        end if;    
    end loop;
   tmp_sql := tmp_sql || '] as ' || group_colomn || ' from ' || table_name || tmp_sql2;

-- бежим по строкам
for tmprec in execute tmp_sql loop
   ...
   
   for I in  1  .. level  loop
      ...
      -- !!!! Вот здесь динамически обращаемся к полям масиива !!!!
      value := tmprec.group[I];
      ...
   end loop;

...
end loop;
end;

...
Рейтинг: 0 / 0
Динамически пройтись по столбцам таблицы в функции ... Как?
    #35721054
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://sql.ru/forum/actualthread.aspx?tid=497974&hl=%f6%e8%ea%eb+%f1%f2%ee%eb%e1%f6%e0%ec
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Динамически пройтись по столбцам таблицы в функции ... Как?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]