数据库实验六---存储过程

来源:互联网 发布:淘宝网怎么装修店铺 编辑:程序博客网 时间:2024/06/03 06:36

什么是存储过程?

是一组被编译在一起的T-SQL语句的集合,它们被集合在一起以完成一个特定的任务。

存储过程的分类
系统存储过程
扩展存储过程(提供从SQL Server到外部程序的接口,以便进行各种维护活动)

用户自定义的存储过程

存储过程的作用

1.模块化编程
创建一个存储过程存放在数据库中后,就可以被其他程序反复使用。
2.执行速度快
存储过程第一次被执行后,就驻留在内存中。以后执行就省去了重新分析、优化、编译的过程。
3.减少网络通信量
有了存储过程后,在网络上只要一条语句就能执行一个存储过程。
4.保证系统安全性
通过隔离和加密的方法提高了数据库的安全性,通过授权可以让用户只能执行存储过程而不能直接访问数据库对象。

创建存储过程
CREATE  PROC[EDURE]   存储过程名 
[ { @参数名  数据类型 } [ = default ] [OUTPUT] 
] [ , … n ]
  AS  
   SQL语句 [ … n ]

执行存储过程
[ EXEC [ UTE ] ] 存储过程名      [实参 [, OUTPUT] [, … n] ]


好了,下面开始以我们的实验为例来看看存储过程了:


实验内容:

1, 在图书管理数据库中创建一个存储过程,在用户借书之前,判断该用户能否借书。并进行测试,同时给出测试代码。

2. 在图书管理数据库中创建一个用户借书的存储过程,并测试。同时给出测试代码。

3, 在图书管理数据库中创建一个用户还书的存储过程,并测试。同时给出测试代码。

4, 在图书管理数据库中创建一个删除指定用户的存储过程并测试。同时给出测试代码。


/*1, 在图书管理数据库中创建一个存储过程,在用户借书之前,判断该用户能否借书。并进行测试,*/
同时给出测试代码。
create procedure bjudge_Borrow
@借阅证号 varchar(50),@书号 varchar(50)
as
declare @number int
if @借阅证号 is NULL
return 1
if(select COUNT(*) from Users where 借阅证号 = @借阅证号)=0
return 2
else
begin
select @number = (select COUNT(*) from Loan where 借阅证号 = @借阅证号)
if(select 借书上限-@number from Class_Users,Users where Users.借阅证号=@借阅证号 and 编号 = 分类)<0
return 3
else
begin
if(select 借阅对象 from Books where 书号 = @书号) = '0'
return 4
if((select 借阅对象 from Books where 书号 = @书号) = '23' and ((select 分类 from Users where 借阅证号 = @借阅证号)='2' or (select 分类 from Users where 借阅证号 = @借阅证号)='3'))
return 5
if(((select 借阅对象 from Books where 书号 = @书号) = '23') and ((select 分类 from Users where 借阅证号 = @借阅证号) !='2' and (select 分类 from Users where 借阅证号 = @借阅证号) !='3'))
return 6
if (select 借阅对象 from Books where 书号 = @书号) = '99'
return 7
end
end
------------执行此存储过程---------
declare @ret int,@tip varchar(50)
exec @ret = bjudge_Borrow @借阅证号 = 'G01000', @书号 = 'A04500014'
set @tip = case @ret
   WHEN 1 THEN  '提示: 必须指定一个借阅证号!'
   WHEN 2 THEN  '提示: 指定的借阅证号不存在!'
   WHEN 3 THEN  '提示:  结束已达上限,不可借书!'
   WHEN 4 THEN  '提示: 本书对任何用户可外借 '
   WHEN 5 THEN  '提示: 可以借阅书本!'
   WHEN 6 THEN  '提示6:  不可以借阅!本书只对研究生和教师外借'
   WHEN 7 THEN  '提示:  本书对任何用户不可外借!'
  END
PRINT @tip


/*2、在图书管理数据库中创建一个用户借书的存储过程,并测试。同时给出测试代码。 */
create proc loan_Borrow
@借阅证号 varchar(50),@书号 varchar(50)
as
insert into Loan(借阅证号,书号,借阅日期)values(@借阅证号,@书号,getdate())


------------执行此存储过程--------- 
exec loan_Borrow @借阅证号='Y00001',@书号='A04500011'




/*3、在图书管理数据库中创建一个用户还书的存储过程,并测试。同时给出测试代码。*/
create proc return_book
@借阅证号 varchar(50),@书号 varchar(50)
as
delete from Loan where 借阅证号 = @借阅证号 and 书号 = @书号


------------执行此存储过程--------- 
exec return_book @借阅证号='Y00001',@书号='A04500047'


/*在图书管理数据库中创建一个删除指定用户的存储过程并测试。同时给出测试代码*/
create proc option_delete
@借阅证号 varchar(50)
as
delete from Loan where 借阅证号 = @借阅证号
delete from Loanlist where 借阅证号 = @借阅证号
delete from Money where 借阅证号 = @借阅证号
delete from Reservation where 借阅证号 = @借阅证号
delete from Users where 借阅证号 = @借阅证号


------------执行此存储过程--------- 
exec option_delete 'G01000'


写完之后总感觉有很多要改的地方,比如第一题的判断,我是通过return一个数值,然后使用case语句打印输出的,但这样仿佛和真实的图书馆存储过程有点区别,后来和室友讨论之后,感觉还是使用return语句,直接在判断之后直接print打印出结果,这样的话在执行存储过程的时候只需要输入借阅证号和书号即可,不需要再麻烦的使用case语句了.其他的目前还没有发现有什么别的问题,如果有人看到了我的问题,欢迎指出.




原创粉丝点击