什么是存储过程?
是一组被编译在一起的T-SQL语句的集合,它们被集合在一起以完成一个特定的任务。
存储过程的分类用户自定义的存储过程
存储过程的作用
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语句了.其他的目前还没有发现有什么别的问题,如果有人看到了我的问题,欢迎指出.