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.
См. также
CREATE LANGUAGESPI_freetuptable
SPI_freetuptable — free a row set created by SPI_execute
or a similar function
Synopsis
void SPI_freetuptable(SPITupleTable * tuptable
)
Description
SPI_freetuptable
frees a row set created by a prior SPI command execution function, such as SPI_execute
. Therefore, this function is often called with the global variable SPI_tuptable
as argument.
This function is useful if an SPI-using C function needs to execute multiple commands and does not want to keep the results of earlier commands around until it ends. Note that any unfreed row sets will be freed anyway at SPI_finish
. Also, if a subtransaction is started and then aborted within execution of an SPI-using C function, SPI automatically frees any row sets created while the subtransaction was running.
Beginning in PostgreSQL 9.3, SPI_freetuptable
contains guard logic to protect against duplicate deletion requests for the same row set. In previous releases, duplicate deletions would lead to crashes.
Arguments
SPITupleTable *
tuptable
pointer to row set to free, or NULL to do nothing