pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
这里只有几个函数用来展示编写 PL/pgSQL 函数有多么容易。 想要更复杂的例子,程序员可以去看 PL/pgSQL 的回归测试。
用 PL/pgSQL 编写函数的一个痛苦细节是单引号的处理。 CREATE FUNCTION 中函数的源文本必须是一个字面量字符串。字面量 字符串内部的单引号必须加倍或者用反斜线引用。我们仍在寻找优雅 的替代方案。在此期间,应当像下面的例子那样把单引号加倍。 Postgres未来版本中对这一问题的任何 解决方案都将是向上兼容的。
下面两个 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';
这又是 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';
这个触发器保证,每当表中有行被插入或更新时,当前的用户名和 时间都会被盖章到该行中。而且它还保证给出了员工的名字并且 薪水是一个正值。
CREATE TABLE emp (
empname text,
salary int4,
last_date datetime,
last_user name);
CREATE FUNCTION emp_stamp () RETURNS OPAQUE AS '
BEGIN
-- Check that empname and salary are given
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;
-- Who works for us when she must pay for?
IF NEW.salary < 0 THEN
RAISE EXCEPTION ''% cannot have a negative salary'', NEW.empname;
END IF;
-- Remember who changed the payroll when
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();
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。