?
This document uses PHP Chinese website manual Release
PostgreSQL允許通過positional或named符號(hào)來調(diào)用帶有已命名參數(shù)的函數(shù)。 對(duì)于帶有大量參數(shù)的函數(shù)來說,命名符號(hào)是非常有用的,因?yàn)樗箙?shù)和實(shí)際參數(shù)之間的關(guān)聯(lián)更加明確和可靠。 對(duì)位置符號(hào),函數(shù)調(diào)用時(shí),它的參數(shù)值的順序與在函數(shù)聲明時(shí)的順序相同。 對(duì)命名符號(hào),參數(shù)名與函數(shù)的參數(shù)名相匹配,并且可以以任意順序書寫。
對(duì)任意一個(gè)符號(hào),函數(shù)聲明時(shí)帶有缺省值的參數(shù),在調(diào)用時(shí)完全不需要寫上。 對(duì)命名符號(hào),因?yàn)閰?shù)的任意組合可以省略,所以剛才的方法會(huì)非常有用,而位置符號(hào)只能從右到左省略。
PostgreSQL同樣支持位置與命名符號(hào)結(jié)合的mixed符號(hào). 在這種情況下,先寫位置符號(hào),再寫命名符號(hào)。
下例說明了這三種符號(hào)的使用,首先如下定義函數(shù):
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
函數(shù)有兩個(gè)強(qiáng)制參數(shù),a和b,以及一個(gè)可選參數(shù)uppercase(
缺省false)。a和b在輸入時(shí)會(huì)被串聯(lián),然后根據(jù)uppercase參數(shù)來決定使用大寫或小寫。
相比之下,剩下的函數(shù)定義就不重要了。
可參閱Chapter 35獲得更多資料。
在PostgreSQL中,位置符號(hào)是傳統(tǒng)的,將參數(shù)傳遞給函數(shù)的機(jī)制。如下例:
SELECT concat_lower_or_upper('Hello', 'World', true); concat_lower_or_upper ----------------------- HELLO WORLD (1 row)
所有的參數(shù)順序聲明。由于uppercase參數(shù)聲明為true,所以輸出結(jié)果為大寫。 另一個(gè)示例:
SELECT concat_lower_or_upper('Hello', 'World'); concat_lower_or_upper ----------------------- hello world (1 row)
此例中,uppercase參數(shù)被忽略,因此使用缺省值false,這樣,輸出結(jié)果就為小寫。 在位置符號(hào)中,只要參數(shù)帶有缺省值,那么可以從右到左忽略。
對(duì)命名符號(hào),每個(gè)參數(shù)的名子用:=進(jìn)行聲明,以與參數(shù)表達(dá)式分開。如:
SELECT concat_lower_or_upper(a := 'Hello', b := 'World'); concat_lower_or_upper ----------------------- hello world (1 row)
同樣,uppercase參數(shù)被忽略,從而使用缺省值。 使用命名參數(shù)的一個(gè)好處是,參數(shù)可以以任意順序聲明,如:
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)
該符號(hào)是位置和命名符號(hào)的組合,然而,正如已提到的,命名符號(hào)不能在位置符號(hào)之前,如:
SELECT concat_lower_or_upper('Hello', 'World', uppercase := true); concat_lower_or_upper ----------------------- HELLO WORLD (1 row)
在上面所有的查詢中,a和b參數(shù)被聲明為positional型,而uppercase被聲明為name型。 那些帶有默認(rèn)值,名或混合符號(hào)的復(fù)雜的具有許多參數(shù)的函數(shù)可以極大的節(jié)省寫進(jìn)程,并且降低錯(cuò)誤幾率。