4.3. ÐÑзов ÑÑнкÑий #
Postgres Pro позволÑÐµÑ Ð²ÑзÑваÑÑ ÑÑнкÑии Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñми паÑамеÑÑами, иÑполÑзÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ñ Ð¿Ð¾Ð·Ð¸Ñионной или именной пеÑедаÑей аÑгÑменÑов. ÐÐ¼ÐµÐ½Ð½Ð°Ñ Ð¿ÐµÑедаÑа оÑобенно полезна Ð´Ð»Ñ ÑÑнкÑий Ñо множеÑÑвом паÑамеÑÑов, Ñак как она Ð´ÐµÐ»Ð°ÐµÑ ÑвÑÐ·Ñ Ð¿Ð°ÑамеÑÑов и аÑгÑменÑов более Ñвной и надÑжной. РпозиÑионной запиÑи знаÑÐµÐ½Ð¸Ñ Ð°ÑгÑменÑов ÑÑнкÑии ÑказÑваÑÑÑÑ Ð² Ñом же поÑÑдке, в каком они опиÑÐ°Ð½Ñ Ð² опÑеделении ÑÑнкÑии. ÐÑи именной пеÑедаÑе аÑгÑменÑÑ ÑопоÑÑавлÑÑÑÑÑ Ñ Ð¿Ð°ÑамеÑÑами ÑÑнкÑии по именам и ÑказÑваÑÑ Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ в лÑбом поÑÑдке. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ваÑианÑа вÑзова Ñакже ÑÑиÑÑвайÑе влиÑние Ñипов аÑгÑменÑов ÑÑнкÑий, опиÑанное в Разделе 10.3.
ÐÑи запиÑи лÑбÑм ÑпоÑобом паÑамеÑÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð² опÑеделении ÑÑнкÑии Ð·Ð°Ð´Ð°Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, можно вовÑе не ÑказÑваÑÑ. Ðо ÑÑо оÑобенно полезно пÑи именной пеÑедаÑе, Ñак как опÑÑÑиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ лÑбой Ð½Ð°Ð±Ð¾Ñ Ð¿Ð°ÑамеÑÑов, Ñогда как пÑи позиÑионной паÑамеÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ опÑÑкаÑÑ ÑолÑко поÑледоваÑелÑно, ÑпÑава налево.
Postgres Pro Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑмеÑаннÑÑ Ð¿ÐµÑедаÑÑ, когда паÑамеÑÑÑ Ð¿ÐµÑедаÑÑÑÑ Ð¸ по именам, и по позиÑии. Ð ÑÑом ÑлÑÑае позиÑионнÑе паÑамеÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð´Ñи пеÑед паÑамеÑÑами, пеÑедаваемÑми по именам.
ÐÑ ÑаÑÑмоÑÑим вÑе ÑÑи ваÑианÑа запиÑи на пÑимеÑе ÑледÑÑÑей ÑÑнкÑии:
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. ÐÑÑалÑнÑе ÑонкоÑÑи ÑеализаÑии ÑÑнкÑии ÑейÑÐ°Ñ Ð½Ðµ Ð²Ð°Ð¶Ð½Ñ (подÑобнее о ниÑ
ÑаÑÑказано в Ðлаве 37).
4.3.1. ÐозиÑÐ¸Ð¾Ð½Ð½Ð°Ñ Ð¿ÐµÑедаÑа #
ÐозиÑÐ¸Ð¾Ð½Ð½Ð°Ñ Ð¿ÐµÑедаÑа â ÑÑо ÑÑадиÑионнÑй Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ пеÑедаÑи аÑгÑменÑов ÑÑнкÑии в Postgres Pro. ÐÑÐ¸Ð¼ÐµÑ Ñакой запиÑи:
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 â по имени. ÐдинÑÑвенное обоÑнование Ñакого вÑзова здеÑÑ â он ÑÑал ÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑиÑаемÑм. Ðднако Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ ÑложнÑÑ
ÑÑнкÑий Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвом аÑгÑменÑов, ÑаÑÑÑ Ð¸Ð· коÑоÑÑÑ
имеÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, Ð¸Ð¼ÐµÐ½Ð½Ð°Ñ Ð¸Ð»Ð¸ ÑмеÑÐ°Ð½Ð½Ð°Ñ Ð¿ÐµÑедаÑа позволÑÑÑ Ð·Ð°Ð¿Ð¸ÑаÑÑ Ð²Ñзов ÑÑÑекÑивнее и ÑменÑÑиÑÑ Ð²ÐµÑоÑÑноÑÑÑ Ð¾Ñибок.
ÐÑимеÑание
ÐÐ¼ÐµÐ½Ð½Ð°Ñ Ð¸ ÑмеÑÐ°Ð½Ð½Ð°Ñ Ð¿ÐµÑедаÑа в наÑÑоÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¿Ñи вÑзове агÑегаÑной ÑÑнкÑии (но они допÑÑкаÑÑÑÑ, еÑли агÑегаÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¸ÑполÑзÑеÑÑÑ Ð² каÑеÑÑве оконной).