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указываются по имени. В этом примере это мало что добавляет, кроме документации. Для более сложной функции, имеющей множество параметров со значениями по умолчанию, именованная или смешанная нотация может сократить объем написания и уменьшить вероятность ошибки.