实验七存储过程及应用
1.实验目的
1、理解存储过程的概念。
2、掌握存储过程的使用方法。
2.实验要求
1.建立如下的存储过程(基于前面实验建立的表和插入的数据,并为每个存储过程设计返回的状态值):
(1)按要求设计完成如下功能的存储过程。
①查询平均分数在x到y范围内的学生信息。
说明:
该存储过程有两个参数;
要求查询的学生信息包括学号、姓名、院系名称和平均分数。
②更新操作,以学号、课程编号和考试成绩作参数更新指定学生和课程的考试成绩,并返回该学生的平均成绩。
(2)自行再分别设计一个完成查询和完成操作功能的存储过程(在实验报告中要准确描述功能需求)。
(3)在客户端以存储过程和输入SQL语句的方式分别执行相同的查询或操作,比较使用和不使用存储过程的区别。
3、实验过程
(1)①查询平均分数在x到y范围内的学生信息
create procedure cc711@x smallint,@y smallint
as
select学生.学号,学生.姓名,院系.名称,学生.平均成绩
from学生join院系on学生.院系=院系.编号
where学生.平均成绩between@x and@y
EXECUTE cc71160,90
②更新操作,以学号、课程编号和考试成绩作参数更新指定学生和课程的考试成绩,并返回该学生的平均成绩
create procedure mcc712@xh nchar(8),@kcbh nchar(8),@cj int
as
update选课set成绩=@cj where学号=@xh and课程编号=@kcbh
declare@pjcj int
select@pjcj=AVG(成绩)from选课where学号=@xh
return@pjcj
declare@avg int
execute@avg=mcc7122,5,98
print'更新后平均成绩:'+str(@avg,6)
(2)自行再分别设计一个完成查询和完成操作功能的存储过程(在实验报告中要准确描述功能需求)。
create procedure dcc721@kcmc nchar(20)
as
declare@cc721nchar(10)
select@cc721=学生.平均成绩
from学生join选课on学生.学号=选课.学号
where选课.成绩in(select MAX(成绩)
from选课where选课.课程编号in(
select课程编号from课程where学时=@kcmc))
return@cc721
declare@acc721nchar(10)
execute@acc721=dcc721'16'
print'最高分者的平均成绩'+str(@acc721)
(3)在客户端以存储过程和输入SQL语句的方式分别执行相同的查询或操作,比较使用和不使用存储过程的区别。
存储:
create procedure cc731@kcmc nchar(20)
as
select学生.学号,姓名,性别from学生join选课
on学生.学号=选课.学号
where选课.课程编号in(
select课程编号from课程
where课程名称=@kcmc)
execute cc731数据库
输入SQL语句:
select学生.学号,姓名,性别from学生join选课
on学生.学号=选课.学号where选课.课程编号in( select课程编号from课程where课程名称='数据库')
4、实验总结
存储过程比SQL的优势在于一次编译多次使用,因为在存储过程中的SQL语句是已经过了语法检查和编译的,可以直接执行;而SQL总要先进行语法解析和编译才能执行。
另外对于网络执行的话,执行相同的任务,客户端调用存储过程的代码传输量和直接执行SQL语句相比也要更少。
存储中参数的使用很重要,也容易出错。