DO
Выполняет анонимный блок кода как разовую анонимную функцию.
Синтаксис
DO [LANGUAGE <lang_name>] <code>
Описание
DO выполняет анонимный блок кода или, другими словами, разовую анонимную функцию на процедурном языке.
Блок кода обрабатывается так, как если бы он был телом функции без параметров, возвращающей void.
Этот код разбирается и выполняется один раз.
Необязательное выражение LANGUAGE может находиться до или после блока кода.
Анонимные блоки представляют собой конструкции процедурного языка, предназначенные для выполнения кода без его сохранения в системных каталогах базы данных. Концепция анонимных блоков аналогична сценариям (скриптам) в оболочке Unix, которые позволяют сгруппировать несколько команд и выполнить их за один шаг. Как следует из названия, анонимные блоки не имеют имени, поэтому на них нельзя ссылаться из других объектов. Несмотря на то, что анонимные блоки создаются динамически, их можно сохранять в виде скриптов в файлах операционной системы для последующего повторного использования.
Анонимные блоки являются стандартными блоками процедурного языка. Они используют синтаксис и подчиняются правилам процедурного языка, включая объявление и область видимости переменных, выполнение, обработку исключений и работу с языковыми конструкциями.
Компиляция и выполнение анонимных блоков выполняются одновременно, тогда как пользовательскую функцию необходимо переопределять перед каждым использованием при изменении ее определения.
Параметры
| Параметр | Описание |
|---|---|
code |
Код на процедурном языке для выполнения.
Он должен быть указан как строковый литерал, так же как и в команде Поддерживаются следующие процедурные языки: PL/pgSQL ( |
lang_name |
Имя процедурного языка, на котором написан код.
По умолчанию — |
Примечания
Язык PL/pgSQL установлен в системе Greengage DB и зарегистрирован во всех пользовательских базах данных. Языки PL/Python и PL/Perl установлены по умолчанию, но не зарегистрированы. Другие языки не установлены и не зарегистрированы. Системный каталог pg_language содержит информацию о языках, зарегистрированных в базе данных.
Пользователь должен иметь привилегию USAGE для процедурного языка или быть суперпользователем, если язык не является доверенным.
Это то же самое требование к привилегии, что и для создания функции на языке.
Анонимные блоки не поддерживают изменчивость (volatility) функции и атрибуты EXECUTE ON.
Примеры
Пример на PL/pgSQL, который выдает все привилегии на все представления в схеме 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
$$;
Пример на PL/pgSQL, который определяет, является ли пользователь Greengage DB суперпользователем. В примере анонимный блок извлекает значение из временной таблицы:
CREATE TEMP TABLE list AS
VALUES ('gpadmin')
DISTRIBUTED RANDOMLY;
DO
$$
DECLARE
name TEXT := 'gpadmin';
superuser TEXT := '';
t1_row pg_authid%ROWTYPE;
BEGIN
SELECT *
INTO t1_row
FROM pg_authid,
list
WHERE pg_authid.rolname = name;
IF t1_row.rolsuper = 'f' THEN
superuser := 'not ';
END IF;
RAISE NOTICE 'user % is %a superuser', t1_row.rolname, superuser;
END
$$ LANGUAGE plpgsql;
В примере PL/pgSQL используется SELECT с выражением INTO.
Это отличается от SQL-команды SELECT INTO.
Совместимость
В стандарте SQL нет оператора DO.