Статья основана на восемнадцатом видео из 31 темы курса SQL 2.0 — PL/pgSQL в PostgreSQL от Аристова Евгения, который является логическим продолжением курса SQL c 0. Ссылки на видео на платформах RUTUBE и VK video.
В данной статье подробно разбираются понятие процедуры, отличие их от функции и возвращение значения процедуры.
В прошлой статье разбираются полиморфные типы данных функций и ограничения при их использовании
Презентация и исходники доступны по ссылке.
Понятие процедуры. Отличие от функции
Появились в PostgreSQL 11
CREATE [ OR REPLACE ] PROCEDURE
имя ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ { DEFAULT | = } выражение_по_умолчанию ] [, ...] ] )
{ LANGUAGE имя_языка
...
} …
Отличие состоит в том, что по классике все говорят — процедура не возвращает значение (мы же все помним про OUT/INOUT, поэтому утверждение неверное), и поэтому для неё не определяется возвращаемый тип.
Самое большое отличие — функция вызывается в составе запроса DQL или команды DML, процедура вызывается явно,оператором CALL
Из процедуры мы можем вызывать другие процедуры и функции и наоборот.
Классическое применение — обслуживающие рутины.
Процедуры VS функции
Ключевые различия:
Функции
- Возвращают значение
- Можно использовать в SELECT
- Могут быть IMMUTABLE
- Не могут создавать новые транзакции
Процедуры
- Не возвращают значения
- Нельзя использовать в SELECT
- Всегда VOLATILE
- Могут выполнять COMMIT/ROLLBACK
Возвращение значения
Процедура не возвращает никакого значения, поэтому она может завершаться без оператора RETURN. Если вы хотите досрочно завершить выполнение кода оператором RETURN, напишите просто RETURN без возвращаемого выражения.
Если у процедуры есть выходные параметры, конечные значения соответствующих им переменных будут выданы вызывающему коду.
Итоги
Процедуры идеально подходят для:
- Операций, изменяющих состояние БД
- Сложных бизнес-транзакций
- ETL-процессов
- Административных задач
- Пакетной обработки
Преимущества процедур:
- Полный контроль над транзакциями
- Улучшенная обработка ошибок
- Лучшая производительность для DML операций
- Более чистый код для операций без возвращаемых значений
Пример кода
DROP TABLE IF EXISTS tbl;
CREATE TABLE tbl (i int);
CREATE or replace PROCEDURE insert_data(a integer, b integer)
LANGUAGE SQL
AS $$
INSERT INTO tbl VALUES (a);
INSERT INTO tbl VALUES (b);
$$;
-- вызовем процедуру используя CALL
CALL insert_data(1, 2);
SELECT * FROM tbl;
Больше примеров доступно на гитхабе и в видео.
В следующей статье мы разберём анонимные процедуры.
Добавить комментарий