pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
PL/pgSQL 是一种块结构语言。函数定义的完整文本 必须是一个块。块的定义为:
[ <<label>> ] [ DECLAREdeclarations] BEGINstatementsEND;
块中的每个声明和每条语句都以分号结束。
所有关键字和标识符都可以用大小写混合书写。除非加双引号,标识符会被隐式 转换为小写。
PL/pgSQL 中有两类注释。双划线(--) 开始一个延续到行尾的注释。/* 开始一个延续到下一个 */ 的块注释。块注释不能嵌套,但双划线注释可以包含 在块注释中,双划线也可以隐藏块注释定界符 /* 和 */。
块的语句部分中的任何语句都可以是一个子块。子块可用于 逻辑分组,或把变量局部化到一小群语句。
块前导声明区中声明的变量,在每次进入该块时都会被初始化为它们的默认值, 而不是每次函数调用只初始化一次。例如:
CREATE FUNCTION somefunc() RETURNS integer AS '
DECLARE
quantity integer := 30;
BEGIN
RAISE NOTICE ''Quantity here is %'', quantity; -- Quantity here is 30
quantity := 50;
--
-- Create a subblock
--
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;
重要的是,不要把 PL/pgSQL 中用于语句分组的 BEGIN/END 与事务控制的数据库命令混淆。 PL/pgSQL 的 BEGIN/END 只用于分组;它们不开始或结束事务。函数和触发器过程总是在由外层查询 建立的事务中执行——它们不能开始或提交事务,因为 PostgreSQL 没有嵌套事务。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。