Статья основана на четырнадцатом видео из 31 темы курса SQL 2.0 — PL/pgSQL в PostgreSQL от Аристова Евгения, который является логическим продолжением курса SQL c 0. Ссылки на видео на платформах RUTUBE и VK video.
В данной статье подробно разбираются входные и выходные параметры, объявление параметров функции и нюанс возвращения функции.
В прошлой статье мы разобрали использование, переопределение операторов, их ключевые преимущества и ограничения.
Презентация и исходники доступны по ссылке.
Входные выходные параметры
FUNCTION ([режим] параметр 1, [режим] параметр 2 ...)
RETURN тип_результата
Режимы:
- IN (входной) (default)
- OUT (выходной)
- INOUT (входной и выходной)
- VARIADIC (входной параметра с переменным количеством не менее одного )
Особенности:
- За единственным аргументом VARIADIC могут следовать только аргументы OUT.
- Кроме того, аргументы OUT и INOUT нельзя использовать с предложением RETURNS [TABLE]
- Очень удобно, что теперь можно использовать ИМЕНА переменных для возврата
Объявление параметров функции
Когда функция на PL/pgSQL объявляется с выходными параметрами, им по аналогии выдаются цифровые идентификаторы $n и для них можно создавать псевдонимы точно таким же способом, как и для обычных входных параметров.
Выходной параметр это фактически переменная, стартующая с NULL и которой присваивается значение во время выполнения функции. Возвращается последнее присвоенное значение. Например, функция sales может быть переписана так:
CREATE FUNCTION sales(total real, OUT tax real) AS $$
BEGIN
tax := total * 0.04;
END;
$$ LANGUAGE plpgsql;
Возвращение значения
!!!Важно!!!
Можно:
- или писать RETURNS тип/множество/таблицу
- или указывать OUT/INOUT переменные (при этом можно указать RETURNS и тот же тип ОДНОЙ переменной — но это масло масляное)
- одновременно НЕ работает (есть один нюанс, но в целом нет)
Внутри PL/pgSQL можно использовать без изменений практически любые команды SQL, не возвращающие результат:
INSERT, UPDATE, DELETE, CREATE, DROP…
Команды INSERT, UPDATE, DELETE могут возвращать результат с помощью фразы RETURNING.
Их можно использовать в PL/pgSQL точно так же, как SELECT, добавив фразу INTO.
Использование VARIADIC
Используйте VARIADIC когда:
- Количество однотипных аргументов переменное и заранее неизвестно их количество
- Хотите удобный синтаксис вызова
- Аргументы логически однородны
Избегайте VARIADIC когда:
- Нужно несколько списков аргументов
- Аргументы имеют разныe типы
- Требуется строгая проверка на этапе компиляции
Пример:
CREATE or replace FUNCTION mleast(VARIADIC arr numeric[]) RETURNS numeric AS $$
SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);
$$ LANGUAGE SQL;
SELECT mleast(100 , 50, -1, 5, 4.4);
Больше примеров доступно на гитхабе и в видео.
В следующей статье мы разберём использование кортежей.
Добавить комментарий