DO

Выполняет анонимный блок кода как временная анонимная функция.

Синтаксис

DO [ LANGUAGE <lang_name> ] <code>

Описание

DO выполняет анонимный блок кода, или, иными словами, временную анонимную функцию на процедурном языке.

Блок кода рассматривается так, будто он является телом функции без параметров, возвращающей тип void. Он разбирается и выполняется один раз.

Необязательное предложение LANGUAGE может находиться как до, так и после блока кода.

Анонимные блоки — это структуры процедурных языков, предоставляющие возможность динамически создавать и выполнять процедурный код без его постоянного сохранения в виде объектов базы данных в системных каталогах. Концепция анонимных блоков аналогична скриптам оболочки UNIX, которые позволяют группировать несколько команд, вводимых вручную, и выполнять их как один шаг. Как следует из названия, анонимные блоки не имеют имени, и по этой причине они не могут быть вызваны из других объектов. Хотя такие блоки создаются динамически, их можно легко сохранять в виде скриптов в файлах операционной системы для многократного выполнения.

Анонимные блоки представляют собой стандартные блоки процедурного языка. Они подчиняются синтаксису и правилам соответствующего процедурного языка, включая объявление и область видимости переменных, выполнение, обработку исключений и использование языка.

Компиляция и выполнение анонимных блоков объединены в один шаг, тогда как пользовательскую функцию необходимо переопределять каждый раз при изменении её определения.

Параметры

  • code
    • Процедурный код, который необходимо выполнить. Должен быть указан как строковый литерал, аналогично команде CREATE FUNCTION. Рекомендуется использовать литералы с долларовым кавычками.
  • lang_name
    • Имя процедурного языка, на котором написан код. По умолчанию используется plpgsql.

Замечания

Процедурный язык, который будет использоваться, должен быть уже установлен в текущей базе данных с помощью команды 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.

Смотрите также

CREATE LANGUAGE