DO#
DO
DO — выполнить анонимный блок кода
Синтаксис
DO [ LANGUAGElang_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
.