DO
DO — выполнить анонимный блок кода
Синтаксис
DO [ LANGUAGEимя_языка
]код
Описание
DO
выполняет анонимный блок кода или, другими словами, разовую анонимную функцию на процедурном языке.
Блок кода воспринимается, как если бы это было тело функции, которая не имеет параметров и возвращает void
. Этот код разбирается и выполняется один раз.
Необязательное предложение LANGUAGE
можно записать до или после блока кода.
Параметры
код
Выполняемый код на процедурном языке. Он должен задаваться в виде текстовой строки (её рекомендуется заключать в доллары), как и код в
CREATE FUNCTION
.имя_языка
Имя процедурного языка, на котором написан код. По умолчанию подразумевается
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$$;
Совместимость
Оператор DO
отсутствует в стандарте SQL.