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.