|
知识路径: > 数据库技术 > 数据库标准语言—SQL > SQL-99所支持的对象关系模型 > 函数和过程 > 过程的构造 >
|
相关知识点:3个
|
|
|
|
条件语句包括if-then-else语句,使用语法如下:
|
|
|
|
这段代码假定1、m和h是整型变量,r是行变量。如果我们用这段if-then-else代码替换掉前面一段的for循环中的“set n=n+r.balance”行,则循环将按照低、中和高余额分别计算这三类账户余额的总数。
|
|
|
SQL-99的case语句类似于C/C++语言中的case语句。
|
|
|
SQL-99还包括发信号通知异常条件(exception condition)的概念,以及声明句柄(handler)来处理异常,代码如下:
|
|
|
|
在begin和end之间的语句可以执行signal out-of-stock来引发一个异常。这个句柄说明,如果条件发生,将会采取动作终止begin end中的语句。替换的动作将是continue,它继续从引发异常的语句的下一条语句开始执行。除了明确定义的条件,还有一些预定义的条件,比如sqlexception、sqlwarning和not found。
|
|
|
下图是有关SQL-99的过程构造的实例。过程findEmpl计算给定经理(由参数mgr指定)的所有直接和非直接管理的员工的集合,并且将结果集中员工名字存储在一个被称为empl的关系中(假定这个关系已经存在)。关系manager(empname,mgrname)(假定可用)指明了谁直接为哪个经理工作。所有的直接/非直接管理的员工的集合构成了manager关系的传递闭包的主体。
|
|
|
|
|
该过程使用了两个临时表:newemp和temp。该过程在repeat循环之前把所有直接为mgr工作的员工插入到newemp中。Repeat循环首先把newemp中的所有员工添加到empl中。然后,它计算newemp中为经理工作的员工(除了那些已经找到的mgr的员工)并把它们存储到临时表temp中。最后用temp中的内容替换newemp中的内容。Repeat循环在找不到新员工(非直接的)时终止。我们注意到except子句的用处,它确保即使在有管理的循环(反常的)情况下,该过程仍可工作。例如,如果a为b工作,b为c工作,而c又为a工作,就出现了循环。
|
|
|
虽然在管理控制中循环不可能出现,但是其他的应用中可能会出现循环。例如,假设我们有关系flights(to,from),表示从一个城市直飞可达的其他城市。我们可以修改findEmpl过程来查找从给定城市利用一次或多次航班的一个序列能到达的所有城市。所有我们要做的就是用flight替换manager并且替换相应的属性名。这种情况下有可能出现一个可到达性的循环,但是由于该过程排除了已经找到的城市,所以它能正确执行。
|
|
|