19.10. 例子 #
这里只给出几个函数,演示编写 PL/pgSQL 函数有多么容易。更复杂的例子,程序员可以查看 PL/pgSQL 的回归测试。
用 PL/pgSQL 编写函数的一个令人头疼的细节是单引号的处理。CREATE FUNCTION 中函数的源文本必须是字面字符串。字面字符串内部的单引号必须加倍或用反斜线引用。我们仍在寻找一种优雅的替代方案。在此期间,应像下面的例子那样把单引号加倍。PostgreSQL 未来版本中对此的任何解决方案都将是向前兼容的。
关于在不同情况下如何转义单引号的详细解释和例子,请参见第 19.11.1.1 节。
例 19.2. 一个使整数递增的简单 PL/pgSQL 函数
下面两个 PL/pgSQL 函数与 C 语言函数讨论中的对应函数相同。这个函数接收一个 integer 并使它递增一,返回递增后的值。
CREATE FUNCTION add_one (integer) RETURNS INTEGER AS '
BEGIN
RETURN $1 + 1;
END;
' LANGUAGE 'plpgsql';例 19.3. 一个连接文本的简单 PL/pgSQL 函数
这个函数接收两个 text 参数并返回它们连接的结果。
CREATE FUNCTION concat_text (TEXT, TEXT) RETURNS TEXT AS '
BEGIN
RETURN $1 || $2;
END;
' LANGUAGE 'plpgsql';例 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';