存储过程

在机房重构的过程中用了很多的存储过程,但是感觉对存储过程的理解还不够深刻,下面就来总结一下。

到底何为存储过程?

Andrea说:完成一定功能,可被重复调用的程序

百度说:
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。

有存储过程能解决什么问题?

1.安全
把代码封装到了数据库里,从安全性上来说,远远大于纯代码。
2.提高性能,提高执行效率
存储过程只是在创建时编译一次,可以被多次执行,当再次执行的时候就不需要重新编译,所以大大提高了效率。
3.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

存储过程的缺点?

1:调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。
2:移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
3:重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
4: 如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。

如何使用存储过程?
在机房重构的时候当执行一次操作,需要更新插入多张表的数据时会使用存储过程,如果不使用存储过程,当执行一次操作时候,需要创建多次数据库连接以及执行多次七层,这样子不仅麻烦,而且会影响性能,占用资源。

像机房结账的时候,当点击结账功能,我们需要同时更新Card_Info表,CancelCard表,还有Recharge_Info表,还要往Account表插入数据,这时当更改多张表时,还是只要有一个更新不成功就算失败,与事物处理相结合,这样存储过程更有意义。

if @count=4
set xact_abort on 
// 事物处理
begin try

//成功执行更新操作
begin tran
--set @date1=GETDATE ()
//更新CancelCard表,把未结账设为已记账
update CancelCard_Info set Ischeck ='结账'where UserID =@UserID and Ischeck =@false 

//更新Recharge表,把未结账设为已记账
update ReCharge_Info set Ischeck ='结账'where UserID =@UserID and Ischeck =@false 

//更新Card_Info表,把未结账设为已记账
update Card_Info set IsCheck ='结账'where HeadID =@UserID and IsCheck =@false 

//往结账表插入数据,更新账单
insert into Account_Info (RemainCash,RechargeCash ,CancelCash ,UserID  )values(@RemainCash,@addmoney ,@CancelCash ,@UserID )

--返回表
exec('select * from Account_Info')
commit tran
end try
begin catch
//更新失败则执行回滚操作
rollback tran
end

总结:

存储过程实则是已经写好的一个程序集,可被重复调用,当然存在当用户的需求发生变化时,有太多的存储过程,维护起来会很难的问题,所以应该用在合适的地方。

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗琪小姐姐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值