3
Команды без результата
Команды SQL встраиваются в код PL/pgSQL
как и в выражениях:
запрос подготавливается,
переменные PL/pgSQL подставляются как параметры
SELECT → PERFORM
удобно для вызова функций с побочными эффектами
запросы, начинающиеся на WITH, надо «оборачивать» в SELECT
INSERT, UPDATE, DELETE и другие команды SQL
кроме служебных команд
управление транзакциями — только в процедурах и анонимных блоках
Как мы уже видели в предыдущей теме, PL/pgSQL очень тесно
интегрирован с SQL. В частности, все выражения вычисляются
с помощью подготовленных SQL-операторов. В выражениях можно
использовать переменные PL/pgSQL и параметры подпрограмм — они
автоматически подставляются в запрос в виде параметров.
Внутри кода на PL/pgSQL можно выполнять и отдельные SQL-запросы.
Чтобы выполнить запрос, не возвращающий результат (INSERT,
UPDATE, DELETE, CREATE, DROP и т. п.), достаточно просто написать
команду SQL внутри кода на PL/pgSQL как отдельный оператор.
Как и выражения, команды подготавливаются, а переменные PL/pgSQL
становятся параметрами. Это позволяет закешировать разобранный
(или спланированный) запрос.
Таким же образом можно вызвать и обычный запрос SELECT, а если
его результат не важен — тогда ключевое слово SELECT надо
заменить на PERFORM. Это удобно для вызова функций с побочным
эффектом. Если запрос начинается с WITH, его необходимо
«обернуть» в SELECT (чтобы в конечном итоге запрос начинался
на PERFORM).
Напомним также, что в подпрограммах нельзя использовать служебные
команды, такие как VACUUM, REINDEX и т. п.
Команды COMMIT и ROLLBACK допускаются только в процедурах
и в анонимных блоках кода (выполняемых SQL-командой DO).