例子

這裡是幾個例子用以說明書寫 PL/pgSQL 函數是多麼地容易。對於更複雜的例子,程式員們可以看看用於 PL/pgSQL 回歸測試的程式。

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

一些簡單的 PL/pgSQL 函數

下面的兩個 PL/pgSQL 函數與 C 語言裡討論的對應函數是一樣的。
CREATE FUNCTION add_one (int4) RETURNS int4 AS '
    BEGIN
        RETURN $1 + 1;
    END;
' LANGUAGE 'plpgsql';
CREATE FUNCTION concat_text (text, text) RETURNS text AS '
    BEGIN
        RETURN $1 || $2;
    END;
' LANGUAGE 'plpgsql';

復合型態的 PL/pgSQL 函數

同樣下面的是等效於 C 函數樣例的 PL/pgSQL 函數。
CREATE FUNCTION c_overpaid (EMP, int4) RETURNS bool 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';

PL/pgSQL 觸發器程序

下面的觸發器的作用是:任何時候表中插入或更新了行,當前的用戶名和時間都記錄入行中。並且它保証給出了雇員名稱並且薪水是一個正數。
CREATE TABLE emp (
    empname text,
    salary int4,
    last_date datetime,
    last_user name);

CREATE FUNCTION emp_stamp () RETURNS OPAQUE AS '
    BEGIN
        -- 檢查是否給出了 empname 和 salary
        IF NEW.empname ISNULL THEN
            RAISE EXCEPTION ''empname cannot be NULL value'';
        END IF;
        IF NEW.salary ISNULL THEN
            RAISE EXCEPTION ''% cannot have NULL salary'', NEW.empname;
        END IF;

        -- 我們必須付帳給誰?
        IF NEW.salary < 0 THEN
            RAISE EXCEPTION ''% cannot have a negative salary'', NEW.empname;
        END IF;

        -- 記住何時何人的薪水被修改了
        NEW.last_date := ''now'';
        NEW.last_user := getpgusername();
        RETURN NEW;
    END;
' LANGUAGE 'plpgsql';

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();