一、 实验目的
1、 掌握存储过程的概念、优点、特点及用途;
2、 掌握创建、执行、修改和删除存储过程的方法;
3、 掌握创建游标和使用游标修改表中数据的方法。
二、 实验内容
(一)附加上次实验所创建的数据库“db_Library”,并回顾该库的数据表信息。
(二)练习创建和管理存储过程
1、创建一个名为“PROC_系部读者借阅信息”的无参存储过程,要求显示计算机系读者 2010-
以后借阅的图书信息,包括“读者姓名”、“图书编号”和“借阅日期”三个字段。
创建完成之后,执行上述存储过程,观察执行结果。
2、修改上述的存储过程为带参的存储过程,要求根据所提供的系部名称和时间,查询出该系部在该时间之后借阅了图书的读者信息,包括“读者姓名”、“图书编号”和“借阅日期”三个字段, 并按照读者姓名升序排列,并将读者的总数作为输出参数返回。
创建完成之后,执行上述存储过程,观察执行结果。
3、创建一个名为“Proc_图书借阅信息”的存储过程,要求根据所提供的图书名称或编号,查询出借阅了该图书的读者信息,包括“读者编号”、“读者姓名”、“学号”、“借阅日期”,并返回该存储过程的执行状态。(其中,图书名称或编号可能为空,图书名称采用模糊查询)
创建完成之后,执行上述存储过程,观察执行结果。
4、创建一个名为“Proc_删除读者信息”的存储过程,要求根据所提供的读者编号,删除该编号所对应的读者,如果不存在此编号的读者,则显示“该编号的读者不存在!”。创建完成之后,执行上述存储过程,观察执行结果。
5、创建一个名为“Proc_修改借阅信息”的存储过程,要求根据所提供的读者编号和天数,将该读者的归还日期增加相应的天数,如果不存在该读者的借阅信息,则显示“该读者没有借阅图书!”。创建完成之后,执行上述存储过程,观察执行结果。
6、删除存储过程“Proc_修改借阅信息”。
(三)练习创建游标
1、定义一个游标,将有借书记录的读者的借阅信息(包括读者编号、读者姓名、书名、借阅日期)显示出来。
2、通过游标将图书信息表中记录号为 5 的图书的单价改为 50。
1.创建一个名为“PROC_系部读者借阅信息”的无参存储过程,要求显示计算机系读者 2010-1-2以后借阅的图书信息,包括“读者姓名”、“图书编号”和“借阅日期”三个字段。创建完成之后执行上述存储过程,观察执行结果。
create proc PROC_系部读者借阅信息_ as
select 姓名,图书编号,借阅日期
from tb_borrow,tb_reader
where tb_reader.读者编号=tb_borrow.读者编号 and
系部='计算机系'
and 借阅日期>'2010-1-1'
exec PROC_系部读者借阅信息_
2.修改上述的存储过程为带参的存储过程,要求根据所提供的系部名称和时间,查询出该系部在该时间之后借阅了图书的读者信息,包括“读者姓名”、“图书编号”和“借阅日期”三个字段, 并按照读者姓名升序排列,并将读者的总数作为输出参数返回。创建完成之后,执行上述存储过程,观察执行结果。
go
alter proc PROC_系部读者借阅信息_
@x int output
as
begin
select 姓名,图书编号,借阅日期
from tb_borrow,tb_reader
where 系部='计算机系'
and tb_reader.读者编号=tb_borrow.读者编号
and 借阅日期>='2011-09-20'
group by 姓名,图书编号,借阅日期
order by 姓名
select @x=count(姓名)
from tb_borrow,tb_reader
where 系部='计算机系'
and tb_reader.读者编号=tb_borrow.读者编号
and 借阅日期>='2011-09-20'
group by 姓名,图书编号,借阅日期
order by 姓名
end
declare @x1 int
exec PROC_系部读者借阅信息_ @x1 output
print @x1
3.创建一个名为“Proc_图书借阅信息”的存储过程,要求根据所提供的图书名称或编号,查询出借阅了该图书的读者信息,包括“读者编号”、“读者姓名”、“学号”、“借阅日期”,并返回该存储过程的执行状态。(其中,图书名称或编号可能为空,图书名称采用模糊查询)创建完成之后,执行上述存储过程,观察执行结果。
go
create Proc Proc_图书借阅信息
@x1 int output
as begin
declare @x char(10)
select @x=书名 from tb_book
where 书名 like'%英语%'
select
tb_reader.读者编号,姓名,学号,借阅日期
from tb_borrow,tb_reader,tb_book
where tb_borrow.读者编号=tb_reader.读者编号
and tb_borrow.图书编号=tb_book.图书编号
and 书名=@x
set @x1=1
end
declare @x2 int
exec Proc_图书借阅信息 @x2 output
print @x2
if (@x2)=1
print '成功执行存储过程'
else
print'失败执行存储过程'
4、创建一个名为“Proc_删除读者信息”的存储过程,要求根据所提供的读者编号,删除该编号所对应的读者,如果不存在此编号的读者,则显示“该编号的读者不存在!”。创建完成之后,执行上述存储过程,观察执行结果。
go
create proc Proc_删除读者信息
@a char(6)
as
begin
if exists(select 读者编号 from tb_reader where 读者编号 =@a)
begin
delete from tb_reader where 读者编号=@a
delete from tb_borrow where 读者编号=@a
print '删除信息成功!'
end
else
print '该编号读者不存在!'
end
exec Proc_删除读者信息 'R10007'
5、创建一个名为“Proc_修改借阅信息”的存储过程,要求根据所提供的读者编号和天数,将该读者的归还日期增加相应的天数,如果不存在该读者的借阅信息,则显示“该读者没有借阅图书!”。创建完成之后,执行上述存储过程,观察执行结果。
go
create proc Proc_修改借阅信息
@b char(8),@c int
as
begin
if exists(select *from tb_borrow where 读者编号=@b)
begin
update tb_borrow set 归还日期=dateadd(day,@c,归还日期)
where 读者编号=@b
end
else
print '该读者没有借阅图书'
end
exec Proc_修改借阅信息 @b='R10003',@c=5
6、删除存储过程“Proc_修改借阅信息”。
drop proc Proc_修改借阅信息
7、定义一个游标,将有借书记录的读者的借阅信息(包括读者编号、读者姓名、书名、借阅日期)显示出来。
declare @x1 char(10),@x2 char(10),@x3 char(10),@x4 date
declare cur cursor scroll
for
select 姓名,tb_borrow.读者编号,书名,借阅日期
from tb_book,tb_borrow,tb_reader
where tb_borrow.读者编号=tb_reader.读者编号
and tb_borrow.图书编号=tb_book.图书编号
for read only
open cur
fetch from cur into @x1,@x2,@x3,@x4
while (@@FETCH_STATUS=0)
begin
print '读者姓名'+@x1+' '+'读者编号'+ cast(@x2 as char(10))
+' '+ '书名字'+@x3+' '+'借阅日期'+cast(@x4 as char(10))
fetch from cur into @x1,@x2,@x3,@x4
end
close cur
deallocate cur
8、通过游标将图书信息表中记录号为 5 的图书的单价改为 50。
declare cur1 cursor scroll
for select * from tb_book for
update of tb_book.定价
open cur1
#将游标定位到五号
fetch absolute 5 from cur1
update tb_book
set tb_book.定价=50
#游标定位 current of
where current of cur1
#显示修改后的记录
fetch absolute 5 from cur1
close cur1
deallocate cur1