PostgreSQL 9.0.4 Documentation | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 39. PL/pgSQL - SQL过程语言 | Fast Forward | Next |
PL/pgSQL是一种块结构的语言。 函数定义的所有文本都必须是一个块(block)。可以用下面的方法定义一个块:
[ <<label>> ] [ DECLARE declarations ] BEGIN statements END [ label ];
块中的每个声明和每条语句都是用一个分号终止的, 如果一个子块在另外一个块里,那么END后面必须有个分号,如上所述; 不过结束函数体的最后的END可以不要这个分号。
Tip: 一个常见的错误是紧跟在BEGIN之后使用一个分号,这是不正确的,并且会返回一个语法错误。
如果你想标记出在EXIT声明中的block,或者描述在block中所声明的变量名字,此时,可以选择使用标签(label)。 如果是在END之后给出一个标签,那么,它必须与block开始时定义的标签相匹配。
所有的关键字都是不区分大小写的,正如在SQL命令中一样,会隐式的将其转换成小写,除非是使用双引号。
如同在普通的SQL语句中一样,在PL/pgSQL代码中,用同样的方式定义注释: 在语句的最后,通过一个双破折号(--)来开始一条行注释。 而块注释是成对出现的,通过/*和*/来定义。
块语句段里的任何语句都可以是一个子块(subblock)。 子块可以用于逻辑分组或者把变量局部化为作用于一个比较小的语句组。 Variables declared in a subblock mask any similarly-named variables of outer blocks for the duration of the subblock 该块的范围内; but you can access the outer variables anyway if you qualify their names with their block's label. For example:
CREATE FUNCTION somefunc() RETURNS integer AS $$ << outerblock >> DECLARE quantity integer := 30; BEGIN RAISE NOTICE 'Quantity here is %', quantity; -- Prints 30 quantity := 50; -- -- Create a subblock -- DECLARE quantity integer := 80; BEGIN RAISE NOTICE 'Quantity here is %', quantity; -- Prints 80 RAISE NOTICE 'Outer quantity here is %', outerblock.quantity; -- Prints 50 END; RAISE NOTICE 'Quantity here is %', quantity; -- Prints 50 RETURN quantity; END; $$ LANGUAGE plpgsql;
Note: There is actually a hidden "outer block" surrounding the body of any PL/pgSQL function. This block provides the declarations of the function's parameters (if any), as well as some special variables such as FOUND (see Section 39.5.5). The outer block is labeled with the function's name, meaning that parameters and special variables can be qualified with the function's name.
一定不要把PL/pgSQL里用于语句分组的BEGIN/END和用于事务控制的数据库命令搞混了。 PL/pgSQL的BEGIN/END只是用于分组; 它们不会开始和结束一个事务。 函数和触发器过程总是在一个由外层命令建立起来的事务里执行, 它们无法开始或者提交事务,因为PostgreSQL没有嵌套事务。 不过,一个包含EXCEPTION子句的块实际上形成一个子事务, 它可以在不影响外层事务的情况下回滚。 更多相关信息请参阅Section 39.6.5。