pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
PL/pgSQL是一种块结构语言。 函数定义的完整文本必须是一个块。块的定义是:
[ <<label>> ] [ DECLAREdeclarations] BEGINstatementsEND;
块的语句部分中的任何语句都可以是一个 子块。子块可以用于逻辑分组,或者把变量 局部化到一小组语句中。
块前面的声明部分中声明的变量在每次进入该块时都会被初始化 为它们的默认值,而不是每次函数调用只初始化一次。例如:
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 sub-block
--
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没有嵌套事务。
块中的每条语句和每个声明都以分号结尾。
所有关键字和标识符都可以用大小写混合的形式书写。标识符 会被隐式地转换为小写,除非用双引号括起来。
PL/pgSQL中有两种注释。双横线-- 开始一个延伸到行尾的注释。/*开始一个块注释, 它延伸到下一个*/出现的位置。块注释不能嵌套, 但双横线注释可以被包进块注释中,而双横线也可以隐藏块注释 的定界符/*和*/。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。