DO

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


Синтаксис

DO [ LANGUAGE имя_языка ] код

Описание

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

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

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


Параметры

код

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

имя_языка

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


Примечания

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

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

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


Примеры

Предоставление роли webuser всех прав на все представления в схеме public:

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