Статья основана на четвёртом видео из 31 темы курса SQL 2.0 — PL/pgSQL в PostgreSQL от Аристова Евгения, который является логическим продолжением курса SQL c 0. Ссылки на видео на платформах RUTUBE и VK видео.
В данной статье подробно разбираются команды возврата функции, и при каких обстоятельствах возврат может не произойти.
В прошлой статье мы разобрали различие SQL, PL/pgSQL, PL/Python в PostgreSQL. Назначение и основные особенности.
Презентация и исходники доступны по ссылке.
Входные выходные параметры
FUNCTION (параметр 1, параметр 2 ...)
RETURNS тип_результата
Варианты возвращаемых данных:
- тип_результата — может быть базовый, составной, либо ссылка на тип столбца таблицы. Если функция не должна возвращать значение, в качестве типа результата указывается void (ничего не вернуть)
- Указание SETOF показывает, что функция возвращает множество, а не единственный элемент
- Можно вернуть таблицу
- Последние 2 варианта более подробно рассмотрим в 10 теме.
Непосредственно возвращение значения
Команда в теле функции RETURN с последующим выражением прекращает выполнение функции и возвращает значение выражения в вызывающую программу. Эта форма используется для функций PL/pgSQL, которые возвращают скалярное значение/ составной тип данных или анонимную запись (рассмотрим в дальнейших темах), а не возвращают множество или таблицу.
В функции, возвращающей скалярный тип, результирующее выражение автоматически приводится к типу возвращаемого значения. Однако, чтобы вернуть составной тип (строку), возвращаемое выражение должно в точности содержать требуемый набор столбцов. При этом может потребоваться явное приведение типов.
Для функции с выходными параметрами просто используйте RETURN без выражения. Будут возвращены текущие значения выходных параметров.
Для функции, возвращающей void, RETURN можно использовать в любом месте, но без выражения после RETURN.
Операторы в теле функции, следующие за вызванным RETURN не выполняются!
drop table if exists sales;
create table sales(summa decimal);
insert into sales values (100), (200), (300);
SELECT * FROM sales;
CREATE OR REPLACE FUNCTION sales_insert2(sub real) returns void AS $$
BEGIN
RETURN;
insert into sales values (sub); -- не отработало после RETURN
END;
$$ LANGUAGE plpgsql;
select sales_insert2(600);
table sales;


Видим, что из-за void ничего не выводится, и в нашу сумму не добавилось значение 600, это случилось, потому что из-за RETURN произошёл возврат функции ещё до того, как выполнилось основное действие. Поэтому RETURN стоит ставить после основных действий функции.
Возвращаемое значение функции не может остаться не определённым. Если достигнут конец блока верхнего уровня, а оператор RETURN так и не встретился, происходит ошибка времени исполнения.
Это не касается функций с выходными параметрами и функций, возвращающих void. Для них оператор RETURN выполняется автоматически по окончании блока верхнего уровня.
Несколько примеров:

Если результат выполнения функции не важен, то можно использовать PERFORM. Но только в рамках другой процедуры или функции.
Присвоение значения переменной PL/pgSQL записывается в виде:
переменная { := | = } выражение;

Так как оба варианта равнозначны, рекомендую выбрать единый стиль на своих проектах.
В следующей теме мы разберём объявление входящих переменных и внутренних переменных, типы данных и их преобразование, а также область видимости переменных с одинаковым именем.
Добавить комментарий