Анонимный блок в SQL
Мы обычно пишем запросы: SELECT, INSERT, UPDATE…
Это отдельные команды, и каждая выполняется сама по себе. Но иногда нам хочется написать целую мини-программу, которая делает несколько действий сразу: например, берёт данные из одной таблицы, считает что-то, обновляет другую таблицу и выводит результат.
И при этом нам не нужно, чтобы эта программа сохранялась в базе как функция или процедура - мы просто хотим один раз выполнить код.
Вот для этого и нужен анонимный блок.
А в моем канале Аналитика FM выпуски про расчет Cohort Retention в разных бизнесах.
Канал я веду с нуля подписчиков, рассказываю про аналитику и разбираю различные кейсы на реальных примерах.
Подписывайся, если интересно как устроен мир аналитика!
Анонимный блок - это кусок кода, который:
Объединяет несколько SQL-команд в одну "программу".
Может содержать переменные, условия (IF), циклы (LOOP) и логику, как в обычной программе.
Не сохраняется в базе - после выполнения он исчезает. Его никто не будет видеть в списке функций или процедур.
То есть это как написать одноразовый скрипт: ты его запускаешь, видишь результат - и больше он никуда не сохраняется.
Пример в Oracle PL/SQL
BEGIN
-- объявляем переменную
DECLARE
v_count NUMBER;
BEGIN
-- считаем количество записей в таблице users
SELECT COUNT(*) INTO v_count FROM users;
-- выводим результат
DBMS_OUTPUT.PUT_LINE('Всего пользователей: ' || v_count);
END;
END;
/
Что здесь происходит:
BEGIN ... END; - тело блока, где выполняется логика.
DECLARE - можно объявлять переменные.
SQL-команда SELECT ... INTO считает количество пользователей и кладёт в переменную.
DBMS_OUTPUT.PUT_LINE выводит текст на экран.
/ - говорит Oracle, что блок закончился и его нужно выполнить.
После выполнения блока: переменные исчезают, код никуда не сохраняется, всё "одноразовое".
Пример в PostgreSQL
В PostgreSQL нет точно такого же синтаксиса, но есть DO-блок:
DO $$
DECLARE
v_count INT;
BEGIN
SELECT COUNT(*) INTO v_count FROM users;
RAISE NOTICE 'Всего пользователей: %', v_count;
END
$$;
DO $$ ... $$; - обёртка для анонимного блока. Мы говорим базе, что сейчас идет блок кода, который нужно выполнить целиком как отдельную программу.
Объявляем переменную v_count. Она нам нужна, чтобы сохранить результат вычислений и использовать его дальше внутри блока.
Все, что внутри BEGIN ... END, выполняется пошагово как мини-программа. Считаем количество строк в таблице users и записываем это значение в объявленную переменную
RAISE NOTICE выводит сообщение. % заменяется на значение переменной v_count.
Зачем это нужно
Разовая операция. Хочешь разово обновить данные или проверить что-то - не нужно создавать отдельную функцию.
Тестирование логики. Пробуешь алгоритм, проверяешь, как работает SQL вместе с переменными и условиями.
Быстрое прототипирование. Хочешь понять, как соединить несколько шагов в одну последовательность действий.
Анонимный блок - это как одноразовый скрипт в SQL, который можно писать прямо в базе. Он может быть сложным, с переменными и логикой, но после выполнения исчезает.
Для аналитика это полезно, если нужно быстро посчитать что-то, проверить гипотезу или сделать массовую корректировку данных, не создавая постоянную функцию или процедуру.
В канале Аналитика FM разбираем реальные продуктовые метрики и их реализацию на SQL. Погружаемся в мира аналитики и аналитического мышления.
Если у тебя тоже есть интерес к аналитике,
Подписывайся!
