Как обойти таблицу в PostgreSQL при помощи цикла FOR?
У нас имеется таблица:
-- Тестовая таблица CREATE TABLE IF NOT EXISTS test.t_2022_12_15 ( id bigint NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ), username text COLLATE pg_catalog."default", randomcode text DEFAULT substr(md5(random()::text), 1, 5), CONSTRAINT t_2022_12_15_id_pkey PRIMARY KEY (id) ); -- Вставляем тестовые данные INSERT INTO test.t_2022_12_15 (username) VALUES (unnest(ARRAY['Вася','Вася','Вася','Вася','Маша','Маша','Маша','Маша','Маша','Маша','Ян','Ян','Ян','Ян','Лена','Петя','Петя'])); -- Смотрим на результат вставки SELECT * FROM test.t_2022_12_15;
Выглядит она так:

В таблице всего 17 записей. Идентификаторы идут последовательно начиная с единицы (1) и заканчивая семнадцатью (17).
Мы хотим обойти каждую запись в таблице. Как это сделать?
-- Цикл по таблице DO $$ DECLARE -- Переменная для хранения ИДЕНТИФИКАТОРА из ТЕКУЩЕЙ записи x_id bigint; BEGIN -- Цикл FOR x_id IN (SELECT * FROM test.t_2022_12_15) LOOP -- Здесь "x_id" содержит один идентификатор записи -- на каждую новую итерацию цикла RAISE NOTICE 'id = %, username = %, randomcode = %', x_id, (SELECT username FROM test.t_2022_12_15 WHERE id = x_id), (SELECT randomcode FROM test.t_2022_12_15 WHERE id = x_id); END LOOP; END; $$
Мы объявили одну переменную.
В переменную «x_id» будут перезаписываться текущие индексы записей с типом данных «bigint» на каждой итерации цикла.
Для визуализации работы простого цикла мы будем использовать команду RAISE NOTICE. На каждой итерации цикла мы будем в консоль выводить текущее значение в переменной «x_id«, а также остальные значения в записи под каждым столбцом.
Результат консольных выводов будет такой:

Информационные ссылки
Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org
Официальный сайт СУБД PostgreSQL — https://www.postgresql.org
Команды SQL — https://postgrespro.ru/docs/postgresql/15/sql-commands
Цикл по записям таблицы — https://postgrespro.ru/docs/postgresql/15/plpgsql-control-structures#PLPGSQL-RECORDS-ITERATING