19.2. PL/pgSQL的结构

PL/pgSQL是一种块结构的语言. 函数定义的所有文本都必须是一个. 一个块用下面的方法定义∶

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
END;

在一个块的语句段里的任何语句都可以是一个 子块.子块可以用于逻辑分组或者把变量局部化为 作用于一个比较小的语句组.

在语句块前面的声明段(declarations section)里定义的变量在每次进入 语句块时都初始化为它们的缺省值,而不是每次函数调用时初始化一次. 比如∶

CREATE FUNCTION somefunc() RETURNS INTEGER AS '
DECLARE
   quantity INTEGER := 30;
BEGIN
   RAISE NOTICE ''Quantity here IS %'',quantity;  -- 在这里的数量是 30
   quantity := 50;
   --
   -- 创建一个子块
   --
   DECLARE
      quantity INTEGER := 80;
   BEGIN
      RAISE NOTICE ''Quantity here IS %'',quantity;  -- 在这里的数量是 80
   END;

   RAISE NOTICE ''Quantity here IS %'',quantity;  -- 在这里的数量是 50

   RETURN quantity;
END;
' LANGUAGE 'plpgsql';

我们一定不要把PL/pgSQL里用于语句分组的 BEGIN/END 和 用于事务控制的数据库命令搞混了. PL/pgSQL的 BEGIN/END 只是用于分组(译注∶象 C 里的 {}); 它们不会开始和结束一个事务. 函数和触发器过程总是在一个由外层查询建立起来的事务里执行 --- 它们无法开始或者提交事务,因为 PostgreSQL 没有嵌套事务.

19.2.1. 词法细节

块中的每个语句和声明都是以分号结尾的.

所有关键字和标识符都可疑用混和大小写的方式书写. 如果没有用双引号括起来,那么标识符隐含地转换成小写.

PL/pgSQL里有两种类型的注释.双破折号 -- 引出到该行行尾的单行注释. 一个 /* 开始一个块注释,一直延伸到下一个 */出现. 块注释不能嵌套使用, 但是双破折号注释可以封装在一个块注释里面并且双破折号注释可以隐藏一个块 注释分隔符 /**/