Digital Q.DataBase позволяет вызывать функции, имеющие именованные параметры, используя либо позиционную или именованную нотацию. Именованная нотация особенно полезна для функций с большим количеством параметров, так как она делает связь между параметрами и фактическими аргументами более явной и надежной. В позиционной нотации вызов функции записывается со значениями аргументов в том же порядке, в котором они указаны при объявлении функции. В именованной нотации аргументы сопоставляются с параметрами функции по имени и могут быть записаны в любом порядке. Для каждой нотации также следует учитывать влияние типов аргументов функции, описанное в Раздел 2.7.3.
При использовании любой нотации параметры, имеющие значения по умолчанию в объявлении функции, могут быть полностью опущены при вызове. Однако это наиболее эффективно в именованной нотации, так как она позволяет пропускать любую комбинацию параметров; в то время как в позиционной нотации параметры могут быть опущены только в порядке справа налево.
Digital Q.DataBase также поддерживает смешанную нотацию, объединяющую позиционную и именованную нотации. В этом случае сначала указываются позиционные параметры, а после них — именованные параметры.
Следующие примеры демонстрируют использование всех трёх видов нотации на основе следующего определения функции:
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. Дополнительно имеется один необязательный параметр регистр который по умолчанию
принимает значение false. Входящие a и
b строки будут объединены и приведены либо к верхнему, либо к нижнему регистру в зависимости от регистр
параметра. Остальные детали определения данной функции не имеют значения в данном контексте (см. Глава 5.1 для
получения дополнительной информации).
Позиционная нотация является традиционным механизмом передачи аргументов в функции в Digital Q.DataBase. Пример:
SELECT concat_lower_or_upper('Hello', 'World', true);
concat_lower_or_upper
-----------------------
HELLO WORLD
(1 row)
Все аргументы указываются последовательно. Результат возвращается в верхнем регистре, так как
регистр указан как true.
Другой пример:
SELECT concat_lower_or_upper('Привет', 'World');
concat_lower_or_upper
-----------------------
hello world
(1 строка)
В данном случае регистр параметр опущен, поэтому он принимает значение по умолчанию false, что приводит к выводу в нижнем регистре. В позиционной нотации аргументы могут быть опущены справа налево, при условии наличия у них значений по умолчанию.
В именованной нотации имя каждого аргумента указывается с помощью
=> для его отделения от выражения аргумента.
Например:
SELECT concat_lower_or_upper(a => 'Привет', b => 'World'); concat_lower_or_upper ----------------------- hello world (1 строка)
Вновь аргумент регистр был опущен, поэтому для него устанавливается значение false неявно. Одним из преимуществ использования именованной нотации является возможность указания аргументов в произвольном порядке, например:
SELECT concat_lower_or_upper(a => 'Привет', b => 'World', uppercase => true); concat_lower_or_upper ----------------------- HELLO WORLD (1 row) SELECT concat_lower_or_upper(a => 'Привет', uppercase => true, b => 'World'); concat_lower_or_upper ----------------------- HELLO WORLD (1 row)
Для обеспечения обратной совместимости поддерживается устаревший синтаксис на основе оператора «:=»:
SELECT concat_lower_or_upper(a := 'Привет', uppercase := true, b := 'World'); concat_lower_or_upper ----------------------- HELLO WORLD (1 row)
Смешанная нотация сочетает в себе позиционную и именованную нотации. Однако, как уже было упомянуто, именованные аргументы не могут предшествовать позиционным. Например:
SELECT concat_lower_or_upper('Привет', 'World', uppercase => true);
concat_lower_or_upper
-----------------------
HELLO WORLD
(1 row)
В приведенном выше запросе аргументы a и
b указываются позиционно, тогда как
регистр указывается по имени. В данном примере это практически ничего не добавляет, кроме документирования. При использовании более сложных функций со множеством параметров, имеющих значения по умолчанию, именованная или смешанная нотация может существенно сократить объём кода и снизить вероятность ошибок.
В настоящее время использование именованной и смешанной нотаций вызова при вызове агрегатных функций не поддерживается (однако они работают в тех случаях, когда агрегатная функция используется в качестве оконной функции).