24.4. 例子

这里是几个例子用以说明书写 PL/pgSQL 函数是多么地容易. 对于更复杂的例子,程序员们可以看看用于 PL/pgSQL 蜕变测试的程序.

书写 PL/pgSQL 的一个很痛苦的细节是单引号的使用. CREATE FUNCTION 的函数原文本必须是一个语言字符串. 在一个语言字符串里的单引号要么是两个单引号或者是用反斜杠转意. 我们仍然在寻找一种优美的代替物. 同时,我们应该象下面例子那样使用双引号. 将来任何版本的 Postgres 对此的任何解决方法都将保持向下兼容.

有关在不同场合逃逸单引号的详细解释和例子请参阅 Section 24.5.1.1

Example 24-2. 一个简单的 PL/pgSQL 递增整数的函数

下面的两个 PL/pgSQL 函数与 C 语言里讨论的对应函数是一样的. 这个函数接受一个 integer 然后给它增一, 返回增加之后的数值.

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

Example 24-3. 一个联接文本的简单 PL/pgSQL 函数

这个函数接收两个 text 参数并且返回联接之后 的结果.

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

Example 24-4. 复合类型的 PL/pgSQL 函数

这个例子里,我们拿 EMP(一个表)和一个 integer 作为我们的函数的参数,它返回一个 boolean. 如果 EMP 表的 "salary" 字段是NULL, 那么我们返回"f".否则我们拿这个字段和传递给函数的 integer 进行比较然后返回比较的boolean结果 (t 或 f).这个函数是与相应 C 函数的 PL/pgSQL 的等价物. functions.

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