变量的声明和赋值
复合语句
复合语句作为单一的事务来执行
while循环和repeat循环
退出循环
跳过当前循环进入下一次循环
条件语句
`if-then-else`语句
`case`语句
信号
过程和函数的非标准语法
参考链接
5.2.2 支持过程和函数的语言构造
SQL
所支持的构造赋予了它与通用程序设计语言相当的几乎所有的功能。SQL
标准中处理这些构造的部分称为持久存储模块( Persistent Storage Module,PSM
)。
变量的声明和赋值
变量通过declare
语句进行声明,可以是任意的合法SQL
类型。
使用set
语句进行赋值。
复合语句
一个复合语句有begin…end
的形式,在begin
和end
之间会包含复杂的SQL
语句。如我们在5.2.1节中曾看到的那样,可以在复合语句中声明局部变量。
复合语句作为单一的事务来执行
一个形如begin atomic … end
的可以确保复合语句中包含的所有语句作为单一的事务来执行。
while循环和repeat循环
SQL:1999
支持while
语句和repeat
语句,语法如下:1
2
3while 布尔表达式 do
语句序列;
end while;1
2
3
4repeat
语句序列;
until 布尔表达式
end repeat;
还有for
循环,它允许对查询的所有结果重复执行:1
2
3
4
5
6
7declare n integer default 0;
for r as
select budget from department
where dept_name='Music'
do
set n=n-r.budget
end for;
程序每次获取查询结果的一行,并存入for
循环变量(在上面例子中指r
)中。
退出循环
语句leave
可用来退出循环,
跳过当前循环进入下一次循环
而iterate
表示跳过剩余语句从循环的开始进入下一个元组。
条件语句
if-then-else
语句
SQL
支持的条件语句包括if-then-else
语句,语法如下:1
2
3
4
5
6if 布尔表达式
then 语句或复合语句
elseif 布尔表达式
then 语句或复合语句
else 语句或复合语句
end if;
case
语句
SQL
也支持case
语句,类似于C
C++
语言中的case
语句(加上我们在第3章看到的cae
表达式)。
图5-7提供了一个有关SQL
的过程化结构的更大型一点的例子。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40-- 确认选课的学生数未超过该课所在教室的容量
-- 完成学生对该课的注册
-- 返回错误代码(>=0成功,<0失败)
-- 以out参数的形式返回失败原因
create function registerStudent(
in s_id varchar(5),
in s_courseid varchar(8),
in s_secid varchar(8),
in s_semester varchar(6),
in s_year numeric(4, 0),
out errorMsg varchar(100))
returns integer
begin
-- 选课的学生数
declare currEnrol int;
select count(*) into currEnrol
from takes
where courseid = s_courseid and
sec_id =s_secid and
semester = s_semester and
year = s_year;
-- 该课所在教室的容量
declare limit int;
select capacity into limit
from classroom natural join section
where courseid = s_courseid and
sec_id = s_secid and
semester = s_semester and
year = s_year;
if (currEnrol < limit)
begin
insert into takes values
(s_id, s_courseid, s_secid, s_semester, s_year, null);
return (0);
end
-- 否则,已经达到课程容量上线
set errorMsg = 'Enrollment limit reached for course' ||
s_courseid || 'section' || s_secid;
return (-1);
end;
图中定义的函数registerStudent
首先确认选课的学生数没有超过该课所在教室的容量,然后完成学生对该课的注册。函数返回一个错误代码,这个值大于等于0表示成功,返回负值表示出错,同时以out
参数的形式返回消息来说明失败的原因。
信号
SQL
程序语言还支持发信号通知异常条件(exception condition
),以及声明句柄( handler
)来处理异常,代码如下:1
2
3
4
5declare out_of_classroom_ seats condition
declare exit handler for out_of_classroom_seats
begin
sequence of elements
end;
在begin
和end
之间的语句可以执行signal out_of_classroom_seats
来引发一个异常。这个句柄说明,如果条件发生,将会采取动作终止begin end
中的语句。
另一个可选的动作将是continue
,它继续从引发异常的语句的下一条语句开始执行。除了明确定义的条件,还有一些预定义的条件,比如sqlexception
、 sqlwarning
和not found
过程和函数的非标准语法
尽管SQL
标准为过程和函数定义了语法,但是很多教据库并不严格遵照标准,在语法支持方面存在很多变化。这种情况的原因之一是这些数据库通常在语法标准制定之前就已经引入了对过程和函数的支持机制,然后一直沿用最初的语法。在这里把每个数据库所支持的语法罗列出来并不现实,更多信息请查看相关语言的参考资料。