DO#

DO

DO

DO — выполнить анонимный блок кода

Синтаксис

DO [ LANGUAGE lang_name ] code

Описание

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

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

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

Параметры

code

Код процедурного языка, который должен быть выполнен. Это должно быть указано как строковый литерал, так же, как в CREATE FUNCTION. Рекомендуется использовать кавычки доллара.

lang_name

Имя процедурного языка, на котором написан код. Если не указано, то по умолчанию используется plpgsql.

Примечания

В процедурном языке, который будет использоваться, должно быть уже установлено в текущей базе данных с помощью команды CREATE EXTENSION. plpgsql устанавливается по умолчанию, но другие языки не устанавливаются.

Пользователь должен иметь привилегию USAGE для процедурного языка или быть суперпользователем, если язык недоверенный. Это требование к привилегиям такое же, как и для создания функции на этом языке.

Если DO выполняется в блоке транзакции, то код процедуры не может выполнять операторы управления транзакцией. Операторы управления транзакцией разрешены только если DO выполняется в собственной транзакции.

Примеры

Предоставить все привилегии на все представления в схеме 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$$;

Совместимость

В стандарте SQL нет оператора DO.

См. также

CREATE LANGUAGE