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. Js对象转String的函数 和 JSON转String

    js对象转string的函数 function obj2str(o){ var r = []; if(typeof o =="string") return "" ...

  2. js中判断是不是数字

    使用isaNa来进行判断,这个函数的底层实现是:Nunmber,如果经过转化是数字则返回false,否则返回true Number('100px')返回的是ANA,parseInt('100px')返 ...

  3. Hbase shell详情

    HBase 为用户提供了一个非常方便的使用方式, 我们称之为“HBase Shell”.HBase Shell 提供了大多数的 HBase 命令, 通过 HBase Shell 用户可以方便地创建.删 ...

  4. win7 下配置resin的一些tip

    一.如何查看jdk安装目录: 通过不同方法搜索javac看看, javac.exe 是java的编译器: 可用的搜索方法: 1.cmd 控制台:  where javac 2.开始菜单的搜索: 一直到 ...

  5. UIButton 在UIScrollView里面 点击效果不明显的问题

    self.scrollView.delaysContentTouches = NO; -(BOOL)touchesShouldCancelInContentView { return YES; }

  6. LoadRunner参数数组

    参数数组提供了对一类参数集中存放的机制,其中LR内置的几个函数有:lr_paramarr_idx().lr_paramarr_len().lr_paramarr_random() 同时参数数组必须满足 ...

  7. [转]Linux文件和目录操作命令

    转自:http://www.linuxdiyf.com/bbs/thread-416176-1-1.html 一.文件操作命令1.1 查看文件 Linux下查看文件的命令有很多,下面列出的几个是几乎所 ...

  8. java中子类与基类变量间的赋值

    Java中子类与基类变量间的赋值 子类对象可以直接赋给基类变量. 基类对象要赋给子类对象变量,必须执行类型转换, 其语法是: 子类对象变量=(子类名)基类对象名; 也不能乱转换.如果类型转换失败Jav ...

  9. sql-labs 分享

    前段时间在网上发现了一个阿三同学托管在github上的sql注入入门科普项目,感觉挺不错,在此分享一下.虽然现在有很多工具比如sqlmap可以实现自动化的sql注入,但是个人感觉如果只知其然而不知其所 ...

  10. hive权威安装出现的不解错误!(完美解决)两种方法都可以

    以下两种方法都可以,推荐用方法一! 方法一: 步骤一: yum -y install mysql-server 步骤二:service mysqld start 步骤三:mysql -u root - ...