Перейти к основному содержимому

DO

примечание

Эта страница переведена при помощи нейросети GigaChat.

DO - выполнение анонимного блока кода.

Синтаксис

DO [ LANGUAGE lang_name ] code

Описание

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

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

Опциональня часть LANGUAGE может быть указана как до, так и после блока кода.

Параметры

code
Код на процедурном языке, который необходимо выполнить. Он должен быть указан в виде строкового литерала, как и при использовании CREATE FUNCTION. Рекомендуется использовать литералы с долларовым экранированием (например, $$ ... $$).
lang_name
Название процедурного языка, на котором написан код. Если не указано, по умолчанию используется plpgsql.

Примечания

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

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

Если команда DO выполняется внутри блока транзакции, то код внутри нее не может содержать операторов управления транзакциями (BEGIN, COMMIT, ROLLBACK и другие). Такие операторы разрешены только если 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