http://www.postgresql.org/docs/9.1/static/plpgsql-structure.html

39.2. PL/pgSQL 的结构

PL/pgSQL是一种块式结构的语言。完整的函数定义必须是一个块。一个块的定义形式如下:

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

在块中,每一个声明或语句都以分号结束。一个块出现在另外一个块中的时候,必须接 END;形式,如上图所示。但是包含函数体的最后一个END后,可以不接分号。

注意:在BEGIN后不要接分号。

当你需要在EXIT语句中使用一个块时,你才需要使用 label,或者当你需要通过块名称来把此块内的变量和其他同名变量进行区分时,你需要使用label。如果在 END 后使用了 label,它必须和该块开始时的label相一致。

所有的关键字都是大小写不敏感的。变量定义会被转换为小写字母,除非使用了双引号,这和普通SQL命令中的作法一样。

注释在PL/pgSQL中的作用方式和在普通SQL中的相同。双线开始一个注释知道此行末尾。一个以/*开始的标志表示一段注释,直到遇到 */。块注释是可嵌套的。

在块中的语句章节部分,任何语句都可以是一个子块。子块可以用于逻辑分组或者在小的语句组中使用本地变量定义。在子块中声明的变量,覆盖任何外部块中的同名变量;但是你可以通过给出块名的方式来访问子块外部变量。例如:

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;

注意: 在PL/pgSQL函数体外围,有一个隐藏的”outer block”。此处可提供对函数参数的声明,也包括一些特殊的变量如FOUND。此外围块用函数名来标识,意味着这些个参数和特殊变量可以通过函数名来制定访问路径。

有一点很重要,请不要把PL/pgSQL中的未来分割语句而使用的BEGIN/END和 SQL命令中用于事务控制的 同名指令搞混了。PL/pgSQL的 BEGIN/END 仅仅是用于分割;它们并不能开始或停止一个事务。 函数或者触发器过程总是在一个事务的内部得到执行,这个事务由外部查询发起— 函数或触发器过程不能启动或者提交一个事务,因为没有供它们执行的上下文。但是,一个包含EXCEPTION 的块可以形成一个子事务,此子事务能够回滚而不影响外部事务。

PL/pgSQL学习笔记之四的更多相关文章

  1. PL/pgSQL学习笔记之二

    39.1.1 使用 PL/pgSQL的好处 SQL是 PostgreSQL和其他大多数关系型数据库作为查询语言而使用的语言.它可移植,并容易学习.但是SQL语句必须被数据库服务器逐条地执行. 这意味着 ...

  2. PL/pgSQL学习笔记之八

    http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 另外一种声明 PL/pgSQL 函数的方法是使用 returns ...

  3. PL/pgSQL学习笔记之七

    http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 如果一个PL/pgSQL函数声明了输出参数,输出参数被赋予$n名 ...

  4. PL/pgSQL学习笔记之五

    http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 39.3. 声明 块中使用的所有的变量必须在块的声明节中进行声明 ...

  5. PL/pgSQL学习笔记之三

    http://www.postgresql.org/docs/9.1/static/plpgsql-overview.html 39.1.2. Supported Argument and Resul ...

  6. PL/pgSQL学习笔记之一

    开始 资料来源:http://www.postgresql.org/docs/9.1/static/plpgsql-overview.html 39.1 概要: PL/pgSQL是一种可载入的过程语言 ...

  7. PL/pgSQL学习笔记之十一

    http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 39.3.4. Row 类型 name table_name%R ...

  8. PL/pgSQL学习笔记之十

    http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 39.3.3. 类型拷贝 variable%TYPE %TYPE ...

  9. PL/pgSQL学习笔记之九

    http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 39.3.2. ALIAS newname ALIAS FOR ...

随机推荐

  1. 把一个窗体嵌入到WinForm中进行显示,以CMD窗口为例

    1.添加引用 using System.Runtime.InteropServices; 2. 加入以下代码段 [DllImport("User32.dll ", EntryPoi ...

  2. 使用Selenium+appium进行App测试

    1. 启动安卓虚拟机.

  3. [转]linux之nl命令

    转自:http://www.cnblogs.com/peida/archive/2012/11/01/2749048.html nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容 ...

  4. python与saltstack动态传参变量名的研究

    python动态变量名 import sys createVar = locals() listTemp = range(1,10) for i in range(1, len(sys.argv)): ...

  5. Downloading the Source

    The Android source tree is located in a Git repository hosted by Google. This document  describes ho ...

  6. RequiredFieldValidator的使用

    特別說明:1.一個Button要對頁面的多個控件進行驗證,則需要設置button和其它受控控件的ValidationGroup屬性 aspx頁面實例: <tr class="h&quo ...

  7. ajax 新闻栏目

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. cordova,phonegap 重力感应

    3.0版本后,cordova通过插件模式实现设备API,使用CLI的plugin命令可以添加或者移除插件: $ cordova plugin add org.apache.cordova.device ...

  9. 前端复习-01-dom操作包括ie和现代浏览器处理相关

    一.事件流事件流描述的是从页面中接受事件的顺序.IE的事件流是事件冒泡流,而Netscape的事件流是事件捕获流1.事件冒泡事件冒泡,即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接收,然 ...

  10. 转自 处理老版PIL 到 pillow

    帮新同事部署开发环境, 由于项目代码里用到了PIL库处理图片, 导致一些图片在浏览器中无法正常显示.  几番折腾, 解决了问题, 这里记录一下报的问题, 及解决方法: 1. python版本不对, 6 ...