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

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

PostgreSQL позволяет функциям, которые имеют именованные параметры быть вызванными в позиционнойl или в именованной нотации. Именованная нотация особенно полезна для функций, которые имеют большое количество параметров, так как данная нотация более явно и надёжно выполняет сопоставления между параметрами и фактическими аргументами. В позиционной нотации, вызов функции записывается с значениями её аргументов в том же порядке, в котором аргументы определены в объявлении функции. В именованной нотации, аргументы могут следовать в любом порядке, а сопоставление аргументов и параметров функции происходит по именам.

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

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

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

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

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)

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

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

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

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

Back to top

(С) Виктор Вислобоков, 2008-2023