4.3. Вызов функций#
4.3. Вызов функций #
Tantor BE позволяет вызывать функции с именованными параметрами как в позиционной, так и в именованной нотации. Именованная нотация особенно полезна для функций с большим количеством параметров, так как она делает связи между параметрами и фактическими аргументами более явными и надежными. В позиционной нотации вызов функции записывается с аргументами в том же порядке, в котором они определены в объявлении функции. В именованной нотации аргументы сопоставляются с параметрами функции по имени и могут быть записаны в любом порядке. Также учитывайте влияние типов аргументов функции для каждой нотации, описанное в Раздел 10.3.
В любой из нотаций параметры, для которых в объявлении функции указаны значения по умолчанию, не обязательно указывать в вызове. Но это особенно полезно в именованной нотации, поскольку можно опустить любую комбинацию параметров, в то время как в позиционной нотации параметры можно опускать только справа налево.
Tantor BE также поддерживает смешанную нотацию, которая объединяет позиционную и именованную нотацию. В этом случае позиционные параметры записываются первыми, а именованные параметры следуют за ними.
Следующие примеры проиллюстрируют использование всех трех обозначений с помощью следующего определения функции:
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
.
Остальные детали определения этой функции здесь не важны (см. Глава 35 для
получения дополнительной информации).
4.3.1. Использование позиционной нотации #
Позиционная передача - это традиционный механизм передачи аргументов функциям в Tantor BE. Пример:
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
указан по имени. Такая запись в данном случае лишь улучшает читабельность. А со сложными функциями
с большим количеством параметров, имеющих значения по умолчанию, именная или смешанная
запись может сэкономить много времени на написание и снизить вероятность ошибок.
Примечание
Именованные и смешанные записи вызова в настоящее время не могут использоваться при вызове агрегатной функции (но они работают, когда агрегатная функция используется как оконная функция).