过程化SQL
SQL99标准支持过程和函数的概念,SQL可以使用程序设计语言来定义过程和函数,也可以用关系数据库管理系统自己的过程语言来定义。Oracle的PL/SQL、Microsoft SQL Server的Transact-SQL、IBM DB2的SQL PL、Kingbase的PL/SQL都是过程化的SQL编程语言。本节介绍过程化SQL(Procedural Language/SQL,PL/SQL)。
过程化SQL的块结构
基本的SQL是高度非过程化的语言。嵌入式SQL将SQL语句嵌入程序设计语言,借助高级语言的控制功能实现过程化。过程化SQL是对SQL的扩展,使其增加了过程化语句功能。
过程化SQL程序的基本结构是块。所有的过程化SQL程序都是由块组成的。这些块之间可以互相嵌套,每个块完成一个逻辑操作。下图是过程化SQL块的基本结构。

变量和常量的定义
①变量定义
变量名 数据类型 [[NOT NULL] :=初值表达式] 或
变量名 数据类型 [[NOT NULL] 初值表达式]
②常量的定义
常量名 数据类型 CONSTANT:=常量表达式
常量必须要给一个值,并且该值在存在期间或常量的作用域内不能改变。如果试图修改它,过程化SQL将返回一个异常。
③赋值语句
变量名:=表达式
流程控制
过程化SQL提供了流程控制语句,主要有条件控制语句和循环控制语句。这些语句的语法、语义和一般的高级语言(如C语言)类似,这里只做概要的介绍。读者使用时要参考具体产品手册的语法规则。
①条件控制语句
一般有三种形式的IF语句:IF-THEN语句、IF-THEN-ELSE语句和嵌套的IF语句。
(1)IF语句
IF condition THEN
Sequence_of_statements;
END IF;
(2)IF-THEN语句
IF condition THEN
Sequence_of_statements1;
ELSE
Sequence_of_statements2;
END IF;
(3)嵌套的IF语句
在THEN和ELSE子句中还可以再包含IF语句,即IF语句可以嵌套。
②循环控制语句
过程化SQL有三种循环结构:LOOP,WHILE-LOOP和FOR-LOOP。
(1)最简单的循环语句LOOP
LOOP
Sequence_of_statements;
END LOOP;
多数数据库服务器的过程化SQL都提供EXIT、BREAK或LEAVE等循环结束语句,以保证LOOP语句块能够在适当的条件下提前结束。
(2)WHILE-LOOP循环语句
WHILE condition LOOP
Sequence_of_statements;
END LOOP;
每次执行循环体语句之前首先要对条件进行求值,如果条件为真则执行循环体内的语句序列,如果条件为假则跳过循环并把控制传递给下一个语句。
(3)FOR-LOOP循环语句
FOR count IN [REVERSE] bound1 .. bound2 LOOP
Sequence_of_statements;
END LOOP;
FOR循环的基本执行过程是:将count设置为循环的下界bound1,检查它是否小于上界bound2。当指定REVERSE时则将count设置为循环的上界 bound2,检查count是否大于下界bound1。如果越界则执行跳出循环,否则执行循环体,然后按照步长(+1或-1)更新count的值,重新判断条件。
错误处理
如果过程化SQL在执行时出现异常,则应该让程序在产生异常的语句处停下来,根据异常的类型去执行异常处理语句。
SQL标准对数据库服务器提供什么样的异常处理做出了建议,要求过程化SQL管理器提供完善的异常处理机制。相对于嵌入式SQL简单地提供执行状态信息SQLCODE,这里的异常处理就复杂多了。读者要根据具体系统的支持情况来进行错误处理。







