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';