0Pricing
SQL Academy · Урок

Блоки 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 — локальная установка не требуется.

Все уроки этого курса

  1. Устройство триггеров: BEFORE/AFTER, FOR EACH ROW
  2. Основы функций PL/pgSQL
  3. Блоки DO и анонимный код
  4. Аудит таблиц с помощью триггеров
← Назад к SQL Academy