4.3. 调用函数
PostgreSQL允许函数有命名参数,可以被位置 或名称表示法调用。名称表示法对有大量参数的函数特别有用, 因为它更加明确和可靠的标记了形参和实参之间的联系。 在位置表示法里,一个函数调用的参数值要用与函数声明相同的顺序来写出。 在名称表示法里,参数是通过名称来与函数参数相匹配的,可以以任意顺序写出。
不管用那种表示法,在函数声明时给出的有默认值的参数在调用时不必写出。 但是这在名称表示法中是特别有用的,因为参数的任意组合都是可以省略的。 而在位置表示法中,参数只能从右到左省略。
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
和uppercase
是用位置声明的,而 uppercase
是用名称声明的。在这个例子中,添加了文档中没有的一点。 在一个有多个参数有默认值的更复杂的函数中,名称或者混合表示法可以节省很多敲键, 并且可以减少犯错的几率。