Блоки DO и анонимный код
Запускайте произвольный код PL/pgSQL в блоках DO, управляйте долларовым квотированием и используйте блоки DO для разовых миграций
«Блоки DO и анонимный код» — бесплатный урок SQL Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Что такое блок DO?
Блок DO позволяет выполнять PL/pgSQL без определения именованной функции. Он идеально подходит для разовых миграций и нерегулярных скриптов.
Базовый блок DO
Минимальный синтаксис:
DO $$
BEGIN
RAISE NOTICE 'Hello from PL/pgSQL';
END;
$$ LANGUAGE plpgsql;
-- The language defaults to plpgsql, so you can omit it:
DO $$ BEGIN RAISE NOTICE 'Hi'; END $$;Долларовое цитирование
Разделитель $$ избавляет от необходимости экранировать одинарные кавычки. Для вложенного кода можно использовать тег:
DO $outer$
BEGIN
EXECUTE $inner$ SELECT 'embedded \'quotes\'' $inner$;
END;
$outer$;Условный DDL
Добавьте столбец, только если он ещё не существует:
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name='users' AND column_name='last_login'
) THEN
ALTER TABLE users ADD COLUMN last_login TIMESTAMPTZ;
END IF;
END $$;Циклы для массовой миграции
Выполните пакетное обновление огромной таблицы:
DO $$
DECLARE
rows_updated INT;
BEGIN
LOOP
UPDATE users SET tier = compute_tier(...)
WHERE id IN (
SELECT id FROM users WHERE tier IS NULL LIMIT 10000
);
GET DIAGNOSTICS rows_updated = ROW_COUNT;
EXIT WHEN rows_updated = 0;
COMMIT;
END LOOP;
END $$;Динамический SQL с EXECUTE
Безопасно формируйте строки SQL с помощью format() и EXECUTE:
DO $$
DECLARE
tbl TEXT;
BEGIN
FOR tbl IN SELECT tablename FROM pg_tables WHERE schemaname='public' LOOP
EXECUTE format('ANALYZE %I;', tbl);
END LOOP;
END $$;Управление транзакциями внутри DO
В старых версиях PG блок DO выполняется внутри одной неявной транзакции. PG 11+ разрешает COMMIT/ROLLBACK внутри процедур (CALL), но не внутри DO. Для пакетных миграций с фиксацией транзакций используйте процедуру.
Процедуры и DO
- DO — анонимный блок, выполняется один раз в текущей транзакции
- PROCEDURE — именованная конструкция, поддерживает COMMIT/ROLLBACK и вызывается через CALL
CREATE PROCEDURE migrate_users() LANGUAGE plpgsql AS $$
BEGIN
-- can COMMIT here
END $$;
CALL migrate_users();Обработка ошибок
Блоки EXCEPTION работают так же, как в именованных функциях:
DO $$
BEGIN
...
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'failed: %', SQLERRM;
END $$;Не используйте DO для повторяющихся задач
Если одну и ту же логику потребуется выполнять неоднократно, определите функцию или процедуру. DO предназначен для разовых задач.
Используйте DO в миграциях
Большинство инструментов миграции (Flyway, Sqitch) выполняют обычный SQL. Блоки DO позволяют встраивать управляющую логику без создания отдельных функций.
Итоги
Блоки DO — это нерегулярно выполняемый PL/pgSQL.
- Однократное анонимное выполнение
- Отличный вариант для условного DDL и миграций
- Следите за долларовым цитированием
- Для управления транзакциями используйте PROCEDURE
Быстрая проверка
Вы хотите один раз выполнить PL/pgSQL во время миграции, не создавая именованную функцию. Какую конструкцию следует использовать?
Часто задаваемые вопросы
Урок «Блоки DO и анонимный код» бесплатный?
Да — полный текст урока «Блоки DO и анонимный код» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Блоки DO и анонимный код»?
Запускайте произвольный код PL/pgSQL в блоках DO, управляйте долларовым квотированием и используйте блоки DO для разовых миграций Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Блоки DO и анонимный код»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Устройство триггеров: BEFORE/AFTER, FOR EACH ROW
- Основы функций PL/pgSQL
- Блоки DO и анонимный код
- Аудит таблиц с помощью триггеров