全部產品
Search
文件中心

PolarDB:調用函數

更新時間:Jul 06, 2024

在任意一種記號法中,在函式宣告中給出了預設值的參數根本不需要在調用中寫出。但是這在命名記號法中特別有用,因為任何參數的組合都可以被忽略。而在位置記號法中參數只能從右往左忽略。

簡介

本資料庫也支援混合記號法,它組合了位置和命名記號法。在這種情況中,位置參數被首先寫出並且具名引數出現在其後。下列例子將展示所有三種記號法的用法:

    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參數被強製為大寫或小寫形式。這個函數的剩餘細節對這裡並不重要。

使用位置記號

在本資料庫中,位置記號法是給函數傳遞參數的傳統機制。一個例子:

SELECT concat_lower_or_upper('Hello', 'World', true);
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)
所有參數被按照順序指定。結果是大寫形式,因為`uppercase`被指定為`true`。另一個例子:

```sql
    SELECT concat_lower_or_upper('Hello', 'World');
     concat_lower_or_upper
    -----------------------
     hello world
    (1 row)

這裡,uppercase參數被忽略,因此它接收它的預設值false,並導致小寫形式的輸出。在位置記號法中,參數可以按照從右往左被忽略並且因此而得到預設值。

使用命名記號

在命名記號法中,每一個參數名都用=> 指定來把它與參數運算式分隔開。例如:

    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)

使用混合記號

混合記號法組合了位置和命名記號法。不過,正如已經提到過的,具名引數不能超越位置參數。例如:

    SELECT concat_lower_or_upper('Hello', 'World', uppercase => true);
     concat_lower_or_upper
    -----------------------
     HELLO WORLD
    (1 row)

在上述查詢中,參數ab被以位置指定,而uppercase通過名字指定。在這個例子中,這隻增加了一點文檔。在一個具有大量帶預設值參數的複雜函數中,命名的或混合的記號法可以節省大量的書寫並且減少出錯的機會。

注意

命名的和混合的調用記號法當前不能在調用聚集合函式時使用(但是當聚集合函式被用作視窗函數時它們可以被使用)。