PostgreSQL | Простой цикл по таблице

PostgreSQL | Простой цикл по таблице

Как обойти таблицу в 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;

Выглядит она так:

Таблица с повторяющимися именами на 3 столбца - PostgreSQL
Таблица с повторяющимися именами на 3 столбца — PostgreSQL

 

В таблице всего 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«, а также остальные значения в записи под каждым столбцом.

Результат консольных выводов будет такой:

Простой цикл по таблице в PostgreSQL
Простой цикл по таблице в PostgreSQL

 

Информационные ссылки

Официальный сайт WEB-оболочки pgAdminhttps://www.pgadmin.org

Официальный сайт СУБД PostgreSQLhttps://www.postgresql.org

Команды SQLhttps://postgrespro.ru/docs/postgresql/15/sql-commands

Цикл по записям таблицы — https://postgrespro.ru/docs/postgresql/15/plpgsql-control-structures#PLPGSQL-RECORDS-ITERATING