Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

DO

Выполняет анонимный блок кода как разовую анонимную функцию.

Синтаксис

DO [LANGUAGE <lang_name>] <code>

Описание

DO выполняет анонимный блок кода или, другими словами, разовую анонимную функцию на процедурном языке.

Блок кода обрабатывается так, как если бы он был телом функции без параметров, возвращающей void. Этот код разбирается и выполняется один раз.

Необязательное выражение LANGUAGE может находиться до или после блока кода.

Анонимные блоки представляют собой конструкции процедурного языка, предназначенные для выполнения кода без его сохранения в системных каталогах базы данных. Концепция анонимных блоков аналогична сценариям (скриптам) в оболочке Unix, которые позволяют сгруппировать несколько команд и выполнить их за один шаг. Как следует из названия, анонимные блоки не имеют имени, поэтому на них нельзя ссылаться из других объектов. Несмотря на то, что анонимные блоки создаются динамически, их можно сохранять в виде скриптов в файлах операционной системы для последующего повторного использования.

Анонимные блоки являются стандартными блоками процедурного языка. Они используют синтаксис и подчиняются правилам процедурного языка, включая объявление и область видимости переменных, выполнение, обработку исключений и работу с языковыми конструкциями.

Компиляция и выполнение анонимных блоков выполняются одновременно, тогда как пользовательскую функцию необходимо переопределять перед каждым использованием при изменении ее определения.

Параметры

Параметр Описание

code

Код на процедурном языке для выполнения. Он должен быть указан как строковый литерал, так же как и в команде CREATE FUNCTION. Рекомендуется использовать литерал с долларовыми кавычками. Необязательные ключевые слова игнорируются.

Поддерживаются следующие процедурные языки: PL/pgSQL (plpgsql), PL/Python (plpythonu) и PL/Perl (plperl и plperlu)

lang_name

Имя процедурного языка, на котором написан код. По умолчанию — plpgsql. Язык должен быть установлен в системе Greengage DB и зарегистрирован в базе данных

Примечания

Язык 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.

См. также