在重构机房中经常遇到这样的问题:很多功能的实现都需要涉及到多张表的操作,比如充值、结账和退卡等功能的实现。因此,就需要我们多次对数据库进行操作,代码量不仅会增加,执行效率也会大大打折扣。于是,存储过程就应运而生,以大大提高执行效率。
1、简介
存储过程是一组为了完成特定功能的语句集,经过编译后存储在数据库中,用户通过制定存储过程的名称并给出参数来执行它。存储过程在运算时生成执行方式并存储在数据库当中,当其再次运行时速度比单个的SQL语句要快。
2、优缺点
1)优点
a、复用性强。存储过程可以重复使用,从而减少数据库开发的工作量。
b、提高执行效率。存储过程在创建的时候就进行了编译以后每次执行时都不需要重新编译,执行时比一般SQL语 句更快,提高了效率。
c、减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低 了网络传输的数据量。
d、更加安全。参数化查询过程可以防止SQL注入攻击。
2)缺点
虽然存储过程的使用提高了执行效率,但是,若一个程序系统中大量使用存储过程,如果在后期需求变化时导致数据结构发生变化,就会发生问题,而且后期系统维护也会非常困难,代价也是非常大的。
所以,在使用存储过程时一定要慎重,权衡利弊,尽力使程序达到最优。
3、创建
以重构机房中的充值为例创建一个存储过程,充值业务逻辑为:
1)查询注册表,判断是否已注册,如无注册信息
2)插入学生信息
3)插入学生注册信息
在SQL Sever中建立存储过程,如图,右击选择新建存储过程。
<span style="font-size:20px;"> -- =============================================
-- Author: <Akali>
-- Create date: <2015年05月20日>
-- Description: <Register>
-- =============================================
CREATE PROCEDURE [dbo].[PROC_Register] --创建存储过程
-- 添加存储过程中的参数
@CardID VARCHAR(15),
@StuID VARCHAR(10),
@StuName varchar(10),
@StuSex varchar(10),
@StuDepart varchar(10),
@StuGrade varchar(10),
@StuClass varchar(10),
@StuText varchar(50),
@StuCash varchar(10),
@StuStatus varchar(10),
@RegTime varchar(10),
@RegDate varchar(10),
@UserID varchar(10),
@RegCash varchar(15),
@CheckStatus varchar(10)
AS
BEGIN
--添加SQL语句
select * from T_RegInfo where CardID =@CardID
if @@ROWCOUNT =0
insert into T_StuInfo (CardID,StuID ,StuName ,StuSex,StuDepart,StuGrade,StuClass,StuText,StuStatus,StuCash ) values (@CardID ,@StuID,@StuName,@StuSex ,@StuDepart ,@StuGrade ,@StuClass,@StuText,@StuStatus,@StuCash )
insert into T_RegInfo (CardID ,StuID ,RegDate ,RegTime ,UserID ,RegCash ,CheckStatus ) values (@CardID ,@StuID ,@RegDate ,@RegTime ,@UserID ,@RegCash ,@CheckStatus )
END </span>
这样一个存储过程就完成了,当需要使用的时候,我们就可以直接调用
D
层,以便高效快捷的完成。