PostgreSQL調用函數


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有兩個強制的參數,ab。此外第三個參數是一個可選參數uppercase,默認為falseab輸入將被串聯,並且將根據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)

在上面的查詢中,參數auppercase是用位置聲明的,而 uppercase是用名稱聲明的。在這個例子中,添加了文檔中沒有的一點。在一個有多個參數有默認值的更復雜的函數中,名稱或者混合表示法可以節省很多敲鍵,並且可以減少犯錯的幾率。

注意: 在調用一個聚合函數時,目前不能使用名稱和混合調用表示法(但是當聚合函數用作窗口函數時,它們確實能運行)。

更多知識盡在http://www.infocool.net


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM