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
.