Быстрый старт
Развертывание
Моделирование данных
Подключение
Запись данных
Миграция
Запросы
Операции и обслуживание
Типовое обслуживание
Секционирование
Резервное копирование и восстановление
Масштабирование
Мониторинг
Настройка производительности
Устранение неполадок
Справочник
Руководство по инструментам
Типы данных
Хранилище данных
Выполняющая система
Потоковая передача
Восстановление после сбоев
Конфигурация
Индексы
Расширения
Справочник по SQL
Часто задаваемые вопросы
Выполняет анонимный блок кода как временная анонимная функция.
DO [ LANGUAGE <lang_name> ] <code>
DO выполняет анонимный блок кода, или, иными словами, временную анонимную функцию на процедурном языке.
Блок кода рассматривается так, будто он является телом функции без параметров, возвращающей тип void. Он разбирается и выполняется один раз.
Необязательное предложение LANGUAGE может находиться как до, так и после блока кода.
Анонимные блоки — это структуры процедурных языков, предоставляющие возможность динамически создавать и выполнять процедурный код без его постоянного сохранения в виде объектов базы данных в системных каталогах. Концепция анонимных блоков аналогична скриптам оболочки UNIX, которые позволяют группировать несколько команд, вводимых вручную, и выполнять их как один шаг. Как следует из названия, анонимные блоки не имеют имени, и по этой причине они не могут быть вызваны из других объектов. Хотя такие блоки создаются динамически, их можно легко сохранять в виде скриптов в файлах операционной системы для многократного выполнения.
Анонимные блоки представляют собой стандартные блоки процедурного языка. Они подчиняются синтаксису и правилам соответствующего процедурного языка, включая объявление и область видимости переменных, выполнение, обработку исключений и использование языка.
Компиляция и выполнение анонимных блоков объединены в один шаг, тогда как пользовательскую функцию необходимо переопределять каждый раз при изменении её определения.
Процедурный язык, который будет использоваться, должен быть уже установлен в текущей базе данных с помощью команды CREATE EXTENSION. Язык PL/pgSQL устанавливается вместе с базой данных и по умолчанию регистрируется во всех создаваемых пользователем базах данных. Языки PL/Python и PL/Perl по умолчанию установлены, но не зарегистрированы. Другие языки ни установлены, ни зарегистрированы. Системный каталог pg_language содержит информацию о зарегистрированных языках в базе данных.
Пользователь должен обладать привилегией USAGE для процедурного языка или быть суперпользователем, если язык ненадёжный. Это требование совпадает с тем, которое необходимо для создания функции на этом языке.
Если команда DO выполняется внутри блока транзакции, то код процедуры не может выполнять операторы управления транзакцией. Управляющие операторы транзакций допускаются только в том случае, если DO выполняется в собственной транзакции.
Анонимные блоки не поддерживают атрибуты степени волатильности функций или EXECUTE ON.
Следующий пример на PL/pgSQL предоставляет все права на все представления в схеме public роли webuser:
DO $$DECLARE r record;
BEGIN
FOR r IN SELECT table_schema, table_name FROM information_schema.tables
WHERE table_type = 'VIEW' AND table_schema = 'public'
LOOP
EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ' TO webuser';
END LOOP;
END$$;
Оператор DO отсутствует в стандарте SQL.