標籤:
PostgreSQL允許函數有具名引數,可以被位置 或名稱標記法調用。名稱標記法對有大量參數的函數特別有用,因為它更加明確和可靠的標記了形參和實參之間的聯絡。在位置標記法裡,一個函數調用的參數值要用與函式宣告相同的順序來寫出。在名稱標記法裡,參數是通過名稱來與函數參數相匹配的,可以以任意順序寫出。
不管用那種標記法,在函式宣告時給出的有預設值的參數在調用時不必寫出。但是這在名稱標記法中是特別有用的,因為參數的任意組合都是可以省略的。而在位置標記法中,參數只能從右至左省略。
PostgreSQL也支援混合標記法,混合標記法結合了位置和名稱標記法。因為這個原因,先寫位置參數然後跟著寫具名引數。
下面的例子將說明三種標記法的用法,使用下面的函數定義:
CREATE FUNCTION concat_lower_or_upper(a text, b text, uppercase boolean DEFAULT false)RETURNS textAS$$ 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 參數強製為大寫或者小寫。
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,導致小寫輸出。在位置標記法中,參數只要有預設值就可以從右至左省略。
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)
3. 使用混合標記法
混合標記法結合了位置和名稱標記法。然而,就像之前提到的,具名引數不可以在位置參數前面。例如:
SELECT concat_lower_or_upper(‘Hello‘, ‘World‘, uppercase := true); concat_lower_or_upper ----------------------- HELLO WORLD(1 row)
在上面的查詢中,參數a和uppercase是用位置聲明的,而 uppercase是用名稱聲明的。在這個例子中,添加了文檔中沒有的一點。在一個有多個參數有預設值的更複雜的函數中,名稱或者混合標記法可以節省很多敲鍵,並且可以減少犯錯的幾率。
注意: 在調用一個彙總函式時,目前不能使用名稱和混合調用標記法(但是當彙總函式用作視窗函數時,它們確實能運行)。
更多知識盡在http://www.infocool.net
PostgreSQL調用函數