Документация по PostgreSQL 9.1.1 | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 4. Синтаксис SQL | Fast Forward | Next |
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).
Позиционная нотация является в 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('Hello', 'World', uppercase := true); concat_lower_or_upper ----------------------- HELLO WORLD (1 row)
В даном выше запросе, аргументы a и b задаются позиционно, в то время как аргумент uppercase указывается по имени. Рассмотренный пример, прост и служит целям документирования. С более сложной функцией, имеющей множество параметров, у которых есть значения по умолчанию, именвованная или смешанная нотация может сохранить множество времени при написании запросов, а также снизить вероятность ошибок.