pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
PL/pgSQL 是一种块结构语言。函数定义的 完整文本必须是一个块。块的定义如下:
[ <<label>> ] [ DECLAREdeclarations] BEGINstatementsEND;
块中的每个声明和每条语句都以分号结束。如上所示,嵌套在其他块中的块,必须在 END 之后写分号;但是结束整个函数体的最后一个 END 不需要分号。
所有关键字都不区分大小写。标识符除非用双引号括起,否则会像普通 SQL 命令中那样被隐式转换为小写。
PL/pgSQL 代码中的注释与普通 SQL 相同。双连字符(--)开始一段持续到行尾的注释。/* 开始一段块注释,它会持续到匹配的 */。块注释不能嵌套,但双横线注释可以被包在块注释中,而且双横线可以隐藏块注释定界符 /* 和 */。
块的语句部分中的任意语句都可以是一个子块。子块可用于逻辑分组,或者把变量局部化到一小组语句中。
块前面的声明部分中声明的变量,在每次进入该块时都会被初始化为它们的默认值,而不仅仅是每次函数调用时初始化一次。例如:
CREATE FUNCTION somefunc() RETURNS integer AS $$
DECLARE
quantity integer := 30;
BEGIN
RAISE NOTICE 'Quantity here is %', quantity; -- Quantity here is 30
quantity := 50;
--
-- 创建一个子块
--
DECLARE
quantity integer := 80;
BEGIN
RAISE NOTICE 'Quantity here is %', quantity; -- Quantity here is 80
END;
RAISE NOTICE 'Quantity here is %', quantity; -- Quantity here is 50
RETURN quantity;
END;
$$ LANGUAGE plpgsql;
需要特别注意,不要把BEGIN/END在PL/pgSQL中用于分组语句的用法,与事务控制的数据库命令混淆。PL/pgSQL中的BEGIN/END只用于分组,不会开始或结束事务。函数和触发器函数总是在外层查询建立的事务中执行 — 它们不能开始或提交该事务,否则就没有可供其执行的上下文。但是,包含EXCEPTION子句的块实际上会形成一个可回滚而不影响外层事务的子事务。详见第 35.7.5 节。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。