5-7

来源:百度文库 编辑:神马文学网 时间:2024/04/28 16:02:05


概 述
  SQL是一种非过程性语言,有很强的表达能力。随着基于数据库的应用逻辑日益复杂,在应用中仅仅使用顺序执行的SQL语句序列表现出很大的局限性。减少局限性的方法之一是使用SQL标准的存储过程(stored procedure)和SQL/PSM(persistent stored module,持久存储模块)技术。 5.7.1 数据库存储过程与函数
1.缘由
(1)现在数据库系统往往采用客户机/服务器计算模式,很多工作可以在客户端完成,也可以在服务器端完成。
(2)客户机/服务器系统与传统的数据库系统的一个很重要的区别是:在传统的数据库系统中只存放数据,所有的应用程序都在用户端,都与用户实际运行的应用程序捆绑在一起;而在客户机/服务器系统中,在数据库中还存放程序,由于这种程序以数据库对象的形式存储在数据库中,因此称为存储过程。
(3)存储过程是使用SQL语句和流程控制语句编写的模块,存储过程经编译和优化后存储在数据库服务器端的数据库中,使用时调用即可。
2.使用存储过程的优点
(1)提高运行速度
  在运行存储过程前,数据库服务器对其进行语法和语义分析,并给出优化执行方案
  而调用存储过程时,其执行SQL语句的大部分准备工作已经完成,所以存储过程能以很快的速度执行
  相比之下,交互执行的SQL语句是解释执行的,所以其速度较慢
(2)增强了SQL的功能和灵活性
  存储过程可以用流程控制语句编写,有很强的灵活性
  能完成复杂的逻辑判断和复杂的运算
(3)可以降低网络的通信量
  存储过程存储在服务器端
  执行全部逻辑流程仅需要向服务器发送一次过程请求即可
  避免了交互模式下处理逻辑执行中额外的中间通信开销
(4)减轻了程序编写的工作量
  存储过程可以反复调用
  并可供其它前端应用程序共享应用逻辑
(5)间接实现安全控制功能
  若不允许某些用户直接在表和视图上进行查询
  但可授权他们执行某个存储过程来完成允许范围内的信息查询
3.声明存储过程的一般形式
(1)申明存储过程
  CREATE PROCEDURE <过程名> (<参数>)
  <局部声明>
  <过程体>;
(2)申明函数
  CREATE FUNCTION <函数名> (<参数>)
  RETURNS <返回类型>
  <局部声明>
  <函数体>;
(3)调用语句的形式
  CALL <过程名> (<参数列表>); 5.7.2 SQL/PSM
1.顺序执行
(1)顺序执行是基本控制流程
(2)语句按照自然顺序连续执行
2.条件分支语句
(1)形式
IF <条件> THEN <语句列表>
ELSEIF <条件> THEN <语句列表>
……
ELSEIF <条件> THEN <语句列表>
ELSE <语句列表>
END IF;
(2)例句
CREATE FUNCTION CourseSize(IN courseno INTEGER)
RETURNS VARCHAR[7];
DECLARE NoOfStudents INTEGER;
SELECT COUNT(*) INTO NoOfStudents FROM SC WHERE CNO = courseno;
IF NoOfStudents > 100 THEN RETURN “HUGE”
 ELSEIF NoOfStudents>60 THEN RETURN “LARGE”
 ELSEIF NoOfStudents>20 THEN RETURN “MEDIUM”
 ELSE RETURN “SMALL”
END IF;
(3)说明(针对上述程序)
  第1行:IN整型参数courseno,给出课程编号
  第2行:函数返回一个字符串值,该值描述每门课程学生人数的规模
  第3行:声明一个局部变量NoOfStudents
  第4、5行:查询返回该门课程的学生人数
  第6~9行:根据学生的数量返回以下某个值:{“HUGE”,“LARGE”,“MEDIUM”,“SMALL”}
3.循环语句
(1)标准的WHILE循环结构
  WHILE <条件> DO
   <语句列表>
  END WHILE;
(2)标准的REPEAT循环结构
  REPEAT
   <语句列表>
  UNTIL <条件>
  END REPEAT;
(3)基于游标的循环结构
  FOR <循环名> AS <游标名> CURSOR FOR <查询> DO
   <语句列表>
  END FOR;