PL/pgSQL学习笔记之四
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学习笔记之四的更多相关文章
- PL/pgSQL学习笔记之二
39.1.1 使用 PL/pgSQL的好处 SQL是 PostgreSQL和其他大多数关系型数据库作为查询语言而使用的语言.它可移植,并容易学习.但是SQL语句必须被数据库服务器逐条地执行. 这意味着 ...
- PL/pgSQL学习笔记之八
http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 另外一种声明 PL/pgSQL 函数的方法是使用 returns ...
- PL/pgSQL学习笔记之七
http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 如果一个PL/pgSQL函数声明了输出参数,输出参数被赋予$n名 ...
- PL/pgSQL学习笔记之五
http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 39.3. 声明 块中使用的所有的变量必须在块的声明节中进行声明 ...
- PL/pgSQL学习笔记之三
http://www.postgresql.org/docs/9.1/static/plpgsql-overview.html 39.1.2. Supported Argument and Resul ...
- PL/pgSQL学习笔记之一
开始 资料来源:http://www.postgresql.org/docs/9.1/static/plpgsql-overview.html 39.1 概要: PL/pgSQL是一种可载入的过程语言 ...
- PL/pgSQL学习笔记之十一
http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 39.3.4. Row 类型 name table_name%R ...
- PL/pgSQL学习笔记之十
http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 39.3.3. 类型拷贝 variable%TYPE %TYPE ...
- PL/pgSQL学习笔记之九
http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 39.3.2. ALIAS newname ALIAS FOR ...
随机推荐
- 树莓派 安装 OpenCV 使用CMake 编译工程 最新版2015
一.安装make,cmake sudo apt-get install make sudo apt-get install cmake 二.下载deb包 去这里下载libopencv_2.4.10.d ...
- Ubuntu 安装
最近又有工作需要,又需要在虚拟机上工作了.记得上次使用Ubuntu的时候还是7,8年前呢 用的是vmware 7 ,buntu的版本记不清了.时隔多年又捡起来了,记忆还停留在过去,于是被折腾惨了. 1 ...
- HDU5804 Price List (BestCoder Round #86 A)水题
分析:大于总和输出1 #include <cstdio> #include <cstring> #include <algorithm> using namespa ...
- loadrunner中lr_log_message和lr_output_message 的区别
LoadRunner中lr_output_message和lr_log_message(1)在vgen中,我们必须写输出函数输出信息,将我们所想要了解的信息用函数输出,主要有这么几个函数输出信息: l ...
- Spring配置数据库固定代码
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" > &l ...
- 从今天开始写博客、托管代码到 Github
最近看了一篇文章,译名<简历危险>,原名<Resumes are dangerous>. 作者为Alex Maccaw,他有一篇文章曾经在网上流传甚广——<Traveli ...
- nagios为监控图像添加图片
1. 背景介绍 在监控web页面上显示主机都为问号,如下图所示: 本文的主要目的就是将监控的图片添加进去,让监控图像变得美观. 2. 图片的下载地址 图片的下载地址如下: https://exchan ...
- EF selection expression 与 Linq备忘
一.左连接查询 var query = people.GroupJoin(pets, person => person, pet => pet.Owner, (person, petCol ...
- SQLyog Enterprise 8.14
用户名:yunjian注册码:81f43d3dd20872b6 下载地址:SQLyog Enterprise 8.14
- 【解决】SAE部署Django1.6+MySQL
终于可以舒口气了,今天大部分时间都在搞这个,很是蛋疼,网上资料良莠不齐,我不信这个之前没人做过,但是他们确实分享的不够好. 废话不多说,还是记录一下今天的工作吧. 1,装SVN 这个没什么好说的,去官 ...