在做机房收费的时候,我们经常会遇到这样一个问题:一个操作会同时涉及到对多个表的操作,这时候我们就要创建接口、去D层进行数据操作,重复进行N次。遇到这种情况没有似曾相识的感觉?是的,外观模式,为子系统中的一组接口提供一个一致的界面,即用一个类将需要用到的多个子系统中的方法或属性封装到一起供外界使用,降低程序的耦合度。同样,我们也可以将多个SQL语句封装到一起,给他们提供一个统一的名称供外界一起使用,这样执行过程就快很多。这里就用到了一个数据库工具:存储过程。
存储过程是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。
由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。
下面就以结账过程来举例应用一下
点击结账后,要同时将学生表、充值表、退卡表中的标识字段“ischecked”由“未结账”更改为“已结账”,然后更新日结账表中的充值金额、退卡金额、应收金额三个字段(先判断当日是否已经有记录,如果没有记录,先添加)
这样,我们就会来来往往去D层执行5次,可见存储过程要比批处理的执行速度快得多。
<span style="font-family:Times New Roman;font-size:18px;">ALTER PROCEDURE [dbo].[PRO_alterStatus] -- Add the parameters for the stored procedure here @userID varchar(10), @returncash numeric(15,2), @chargecash numeric (15,2), @allcash numeric (15,2), @checkdate datetime AS BEGIN update student_table set ischecked ='已结账' where userID =@userID and ischecked='未结账' update recharge_table set ischecked ='已结账' where userID =@userID and ischecked='未结账' update cancelcard_table set ischecked ='已结账' where userID =@userID and ischecked='未结账' select * from daycheck where date =@checkdate if @@ROWCOUNT =0 insert into daycheck values (@chargecash ,@returncash ,@allcash ,@checkdate ) else update daycheck set chargecash =chargecash+@chargecash ,returncash =returncash+@returncash ,allcash =allcash+ @allcash where date =@checkdate END</span>
http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html
知识越学越觉得我们掌握的还远远不够,所以还需要更加努力的汲取和吸收。
如有理解不当的地方,欢迎来指正。邮箱:[email protected]