5.2.2 支持过程和函数的语言构造

5.2.2 支持过程和函数的语言构造

SQL所支持的构造赋予了它与通用程序设计语言相当的几乎所有的功能。SQL标准中处理这些构造的部分称为持久存储模块( Persistent Storage Module,PSM)。

变量的声明和赋值

变量通过declare语句进行声明,可以是任意的合法SQL类型。
使用set语句进行赋值。

复合语句

一个复合语句有begin…end的形式,在beginend之间会包含复杂的SQL语句。如我们在5.2.1节中曾看到的那样,可以在复合语句中声明局部变量。

复合语句作为单一的事务来执行

一个形如begin atomic … end的可以确保复合语句中包含的所有语句作为单一的事务来执行。

while循环和repeat循环

SQL:1999支持while语句和repeat语句,语法如下:

1
2
3
while 布尔表达式 do
语句序列;
end while;
1
2
3
4
repeat 
语句序列;
until 布尔表达式
end repeat;

还有for循环,它允许对查询的所有结果重复执行:

1
2
3
4
5
6
7
declare 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
6
if 布尔表达式
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
5
declare out_of_classroom_ seats condition
declare exit handler for out_of_classroom_seats
begin
sequence of elements
end;

beginend之间的语句可以执行signal out_of_classroom_seats来引发一个异常。这个句柄说明,如果条件发生,将会采取动作终止begin end中的语句。
另一个可选的动作将是continue,它继续从引发异常的语句的下一条语句开始执行。除了明确定义的条件,还有一些预定义的条件,比如sqlexceptionsqlwarningnot found

过程和函数的非标准语法

尽管SQL标准为过程和函数定义了语法,但是很多教据库并不严格遵照标准,在语法支持方面存在很多变化。这种情况的原因之一是这些数据库通常在语法标准制定之前就已经引入了对过程和函数的支持机制,然后一直沿用最初的语法。在这里把每个数据库所支持的语法罗列出来并不现实,更多信息请查看相关语言的参考资料。

参考链接

https://blog.csdn.net/Reese1995/article/details/77656173