19.10. 範例

這裡是幾個範例用以說明書寫PL/pgSQL函數是多麼地容易. 對於更復雜的範例,程式員們可以看看用於PL/pgSQL 蛻變測試的程式.

書寫PL/pgSQL的一個很痛苦的細節是單引號的使用. CREATE FUNCTION 裡的函數原純文字必須是一個語言字串. 在一個語言字串裡的單引號要麼是兩個單引號或者是用反斜杠轉意. 我們仍然在尋找一種優美的代替物. 同時,我們應該象下面範例那樣使用雙引號. 將來任何版本的 PostgreSQL 對此的任何解決方法都將保持向下兼容.

有關在不同場合逃逸單引號的詳細解釋和範例請參閱 Section 19.11.1.1

Example 19-2. 一個簡單的PL/pgSQL遞增整數的函數

下面的兩個PL/pgSQL 函數與 C 語言裡討論的對應函數是一樣的. 這個函數接受一個 INTEGER 然後給它增一, 傳回增加之後的數值.

CREATE FUNCTION add_one (INTEGER) RETURNS INTEGER AS '
    BEGIN
        RETURN $1 + 1;
    END;
' LANGUAGE 'plpgsql';

Example 19-3. 一個連結純文字的簡單PL/pgSQL函數

這個函數接收兩個 text 參數並且傳回連結之後 的結果.

CREATE FUNCTION concat_text (text, text) RETURNS TEXT AS '
    BEGIN
        RETURN $1 || $2;
    END;
' LANGUAGE 'plpgsql';

Example 19-4. 復合類型的PL/pgSQL函數

這個範例裡,我們拿EMP(一個表)和一個 INTEGER 作為我們的函數的參數,它傳回一個 BOOLEAN. 如果EMP表的salary 欄位是NULL, 那麼我們傳回f.否則我們拿這個欄位和傳遞給函數的 INTEGER 進行比較然後傳回比較的BOOLEAN結果 (t 或 f).這個函數是與相應 C 函數的PL/pgSQL的等價物.

CREATE FUNCTION c_overpaid (EMP, INTEGER) RETURNS BOOLEAN AS '
    DECLARE
        emprec ALIAS FOR $1;
        sallim ALIAS FOR $2;
    BEGIN
        IF emprec.salary ISNULL THEN
            RETURN ''f'';
        END IF;
        RETURN emprec.salary > sallim;
    END;
' LANGUAGE 'plpgsql';