4.3. Вызов функций#

4.3. Вызов функций

4.3. Вызов функций

Tantor SE позволяет вызывать функции с именованными параметрами как в позиционной, так и в именованной нотации. Именованная нотация особенно полезна для функций с большим количеством параметров, так как она делает связи между параметрами и фактическими аргументами более явными и надежными. В позиционной нотации вызов функции записывается с аргументами в том же порядке, в котором они определены в объявлении функции. В именованной нотации аргументы сопоставляются с параметрами функции по имени и могут быть записаны в любом порядке. Также учитывайте влияние типов аргументов функции для каждой нотации, описанное в Раздел 10.3.

В любой из нотаций параметры, для которых в объявлении функции указаны значения по умолчанию, не обязательно указывать в вызове. Но это особенно полезно в именованной нотации, поскольку можно опустить любую комбинацию параметров, в то время как в позиционной нотации параметры можно опускать только справа налево.

Tantor SE также поддерживает смешанную нотацию, которая объединяет позиционную и именованную нотацию. В этом случае позиционные параметры записываются первыми, а именованные параметры следуют за ними.

Следующие примеры проиллюстрируют использование всех трех обозначений с помощью следующего определения функции:

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. Остальные детали определения этой функции здесь не важны (см. Глава 36 для получения дополнительной информации).

4.3.1. Использование позиционной нотации

Позиционная передача - это традиционный механизм передачи аргументов функциям в Tantor SE. Пример:

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

4.3.2. Использование именованной нотации

В именованной записи имя каждого аргумента указывается с использованием => для отделения его от выражения аргумента. Например:

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)

4.3.3. Использование смешанной нотации

Смешанная нотация комбинирует позиционную и именованную нотацию. Однако, как уже упоминалось, именованные аргументы не могут предшествовать позиционным аргументам. Например:

SELECT concat_lower_or_upper('Hello', 'World', uppercase => true);
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

В приведенном выше запросе аргументы a и b указаны позиционно, в то время как uppercase указан по имени. Такая запись в данном случае лишь улучшает читабельность. А со сложными функциями с большим количеством параметров, имеющих значения по умолчанию, именная или смешанная запись может сэкономить много времени на написание и снизить вероятность ошибок.

Примечание

Именованные и смешанные записи вызова в настоящее время не могут использоваться при вызове агрегатной функции (но они работают, когда агрегатная функция используется как оконная функция).