powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Цикл по полям таблицы на pl/pgsql
10 сообщений из 10, страница 1 из 1
Цикл по полям таблицы на pl/pgsql
    #33788932
Igor Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем здрасьте!

Есть таблица с пронумерованными полями (dim_1, dim_2, dim_3, ...)
Есть ли возможность в цикле перебирать поля?

Пробовал создавать и выполнять динамические команды (EXECUTE) с созданными именами полей, но никак не могу присвоить результат переменной в функции. (В доке так и пишется: EXECUTE не работает с SELECT INTO)

Вот как я пробовал:

DECLARE
t TEXT;
name TEXT;
BEGIN

FOR c IN 1 .. 4 LOOP
name := replace('dim_' || to_char (c, '9999'),' ','');
t:='SELECT ' || name || ' FROM materials WHERE material_id_pkey=2';
EXECUTE t;
END LOOP;

RETURN name;
END;

А результат-то в пустоту :(

Неужели здесь тупик?!

Помогите кто чем может. ПЛЗ.
...
Рейтинг: 0 / 0
Цикл по полям таблицы на pl/pgsql
    #33789071
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
DECLARE
  t TEXT;
  name TEXT;
  values record;
BEGIN

  FOR c IN  1  ..  4  LOOP
    name := replace('dim_' || to_char (c, '9999'),' ','');
    t:='SELECT ' || name || ' FROM materials WHERE material_id_pkey=2';

    for values in execute t
    loop
      values.name; -- вот то, что тебе нужно
    end loop;

  END LOOP;

...........

END;
...
Рейтинг: 0 / 0
Цикл по полям таблицы на pl/pgsql
    #33789285
Igor Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо ZemA за ответ.

Боюсь, что здесь те же грабли:

Результат:
ERROR: record "values" has no field "name"

Нам нужно, чтобы в values.name вместо name использовалось значение строковой переменной, а выражение res := res || ' ' || values.name использует имя поля name :(

RAISE NOTICE 'Values = %1', values; - выдает следующее
NOTICE: Values = (120.000)
NOTICE: Values = (60.000)
NOTICE: Values = (5.000)
NOTICE: Values = (0.000)

Так что результат есть, но как его достать?
...
Рейтинг: 0 / 0
Цикл по полям таблицы на pl/pgsql
    #33789356
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
t:='SELECT ' || name || ' as f1 FROM materials WHERE material_id_pkey=2';
...
values.f1
?
...
Рейтинг: 0 / 0
Цикл по полям таблицы на pl/pgsql
    #33789399
Igor Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СПАСИБО МУЖИКИ!

Вы здорово мне помогли!

Mmm I get high with a little help from my friends,
Mmm I'm gonna to try with a little help from my friends.
(c) The Beatles
...
Рейтинг: 0 / 0
Цикл по полям таблицы на pl/pgsql
    #33789520
Igor Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да... задачка усложнилась.


Теперь нужно что-то типа:

FOR myrec IN (SELECT ..., dim_1, dim_2, dim_3, ... сложный запрос из нескольких таблиц) LOOP

< цикл по полям записи myrec dim_1, dim_2, ... > LOOP

res := res || dim_X; -- например
-- здесь будет довольно большой кусок кода одинаковый для всех полей

END LOOP;

END LOOP;
...
Рейтинг: 0 / 0
Цикл по полям таблицы на pl/pgsql
    #33789609
Opilki_Inside
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А такое не прокатит?

Код: plaintext
1.
2.
3.
select into fields array_to_string(array_accum(attname),'', '') from
   pg_attribute where attnum> 0  and attrelid =
   (select relfilenode from pg_class where
      relname = lower(trim(tname)) and relkind = ''r'');

Переменная fields будет содержать в себе перечень всех полей через запятую. Работает в версии > 7.4. Про array_accum можно почитать в хелпе
...
Рейтинг: 0 / 0
Цикл по полям таблицы на pl/pgsql
    #33789924
Igor Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению это не решает мою проблему.

Мне нужно в строке вида: %2x%1x%3

placeholder-ы %Х заменять значениями соответствующих полей [ dim_X ]

Чтобы в итоге получилось, например, такое: 120х60х5.0

Строка формата может быть какая угодно.
Вот примеры:
Ø%1
%1x%2x%3
%3x%1x%2
NV%1
и т.д.

К сожалению pl/pgsql - не С++
а мне нужна функция на сервере :(
...
Рейтинг: 0 / 0
Цикл по полям таблицы на pl/pgsql
    #33789954
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотри в сторону plperl или plpython :)
...
Рейтинг: 0 / 0
Цикл по полям таблицы на pl/pgsql
    #33790219
Igor Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оказывается и с pl/pgsql проблем-то нету.

и цикл никакой не нужен :)

res := replace (res,'%1', to_char(myrec.dimension_1, fmt));
res := replace (res,'%2', to_char(myrec.dimension_2, fmt));
res := replace (res,'%3', to_char(myrec.dimension_3, fmt));
res := replace (res,'%4', to_char(myrec.dimension_4, fmt));
....

Хорошо иногда с ручника сниматься ;)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Цикл по полям таблицы на pl/pgsql
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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