PostgreSQL позволяет вызывать функции с именованными параметрами, используя либо позиционную , либо именованную нотацию. Именованная запись особенно полезна для функций с большим количеством параметров, поскольку она делает связи между параметрами и фактическими аргументами более явными и надежными. В позиционной нотации вызов функции записывается со значениями аргументов в том же порядке, в котором они определены в объявлении функции. В именованной нотации аргументы сопоставляются с параметрами функции по имени и могут быть записаны в любом порядке. Для каждой нотации также учитывайте влияние типов аргументов функций.
В любой нотации параметры со значениями по умолчанию, заданными в объявлении функции, вообще не нужно записывать в вызове. Но это особенно полезно в именованной нотации, поскольку можно опустить любую комбинацию параметров; в то время как в позиционной записи параметры могут быть опущены только справа налево.
PostgreSQL также поддерживает смешанную нотацию, которая сочетает в себе позиционную и именованную нотацию. В этом случае позиционные параметры записываются первыми, а именованные параметры идут после них.
Следующие примеры иллюстрируют использование всех трех обозначений с использованием следующего определения функции:
CREATE FUNCTION concat_lower_or_upper(a text, b text, uppercase boolean DEFAULT false)
RETURNS text
AS
$$
SELECT CASE
WHEN $3 THEN UPPER($1 || ' ' || $2)
ELSE LOWER($1 || ' ' || $2)
END;
$$
LANGUAGE SQL IMMUTABLE STRICT;
Функция concat_lower_or_upper
имеет два обязательных параметра a
и b
. Кроме того, есть один необязательный параметр uppercase
, который по умолчанию равен false
. Входные данные a
и b
будут объединены и переведены в верхний или нижний регистр в зависимости от uppercase
параметра.
Использование позиционной записи
Позиционная нотация — это традиционный механизм передачи аргументов функциям в PostgreSQL . Пример:
SELECT concat_lower_or_upper('Hello', 'World', true);
concat_lower_or_upper
-----------------------
HELLO WORLD
(1 row)
Все аргументы указаны по порядку. Результат в верхнем регистре, так uppercase
как указывается как true
. Другой пример:
SELECT concat_lower_or_upper('Hello', 'World');
concat_lower_or_upper
-----------------------
hello world
(1 row)
Здесь uppercase
параметр опущен, поэтому он получает значение по умолчанию false
, что приводит к выводу в нижнем регистре. В позиционной нотации аргументы могут быть опущены справа налево, если они имеют значения по умолчанию.
Использование именованной нотации
В именованной нотации имя каждого аргумента указывается с помощью =>
, чтобы отделить его от выражения аргумента. Например:
SELECT concat_lower_or_upper(a => 'Hello', b => 'World');
concat_lower_or_upper
-----------------------
hello world
(1 row)
Опять же, аргумент uppercase
был опущен, поэтому он установлен false
неявно. Одним из преимуществ использования именованной нотации является то, что аргументы могут быть указаны в любом порядке, например:
SELECT concat_lower_or_upper(a => 'Hello', b => 'World', uppercase => true);
concat_lower_or_upper
-----------------------
HELLO WORLD
(1 row)
SELECT concat_lower_or_upper(a => 'Hello', uppercase => true, b => 'World');
concat_lower_or_upper
-----------------------
HELLO WORLD
(1 row)
Старый синтаксис, основанный на ":=", поддерживается для обратной совместимости:
SELECT concat_lower_or_upper(a := 'Hello', uppercase := true, b := 'World');
concat_lower_or_upper
-----------------------
HELLO WORLD
(1 row)
Использование смешанной записи
Смешанная нотация сочетает в себе позиционную и именованную нотацию. Однако, как уже упоминалось, именованные аргументы не могут предшествовать позиционным аргументам. Например:
SELECT concat_lower_or_upper('Hello', 'World', uppercase => true);
concat_lower_or_upper
-----------------------
HELLO WORLD
(1 row)
В приведенном выше запросе аргументы a
и b
указываются позиционно, а uppercase
указываются по имени. В этом примере это мало что добавляет, кроме документации. Для более сложной функции, имеющей множество параметров со значениями по умолчанию, именованная или смешанная нотация может сократить объем написания и уменьшить вероятность ошибки.
0 комментариев