Использование входных и выходных параметров, передача массива

Статья основана на четырнадцатом видео из 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);

Больше примеров доступно на гитхабе и в видео.

В следующей статье мы разберём использование кортежей.


Опубликовано

в

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

1 × пять =