存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的的SQL语句集,存储在数据库中,经过一次编译后再次调用不需再次编译。因为存储过程执行一次之后,会将语句存在在缓存中,这样下次再执行的时候直接使用缓存中的语句,能显著提高存储过程的性能。
存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集。除了下图中这些语句,其他语句都可以在存储过程中使用!
优点:
①重复使用:存储过程可以重复使用当对数据库进行复杂操作时(如对多个表进行增删改查)可将这些操作封装起来,即可以封装业务功能,从而减少数据库开发人员的工作量。
②提高性能:存储过程在创建时进行了编译,将来使用的时候无需再次编译,而一般的SQL语句每执行一次就需要编译一次。所以使用存储过程能够显著提高程序的效率。
③提高安全性:参数化的存储过程可以防止SQL注入式攻击,而且系统管理员可以对某一存储过程进行权限设置,从而实现对数据访问的限制,提高了安全性。
缺点:
①调试麻烦:但是用PL/SQL Developer调试很方便,可以弥补这个缺点。(oracle存在此机制)
②移植问题:数据库端代码是和数据库相关的,但是如果做工程型项目,基本不存在移植问题。
③重新编译问题:因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程将重新编译。
存储过程分类:
①系统存储过程:以SP_开头,用来进行系统的各项设定,取得信息相关管理工作。
②用户自定义存储过程:用户创建的存储过程是由用户创建并完成某一特定功能的存储过程。一般我们所说的存储过程都是用户自定义存储过程。
③临时存储过程:分为两种存储过程:一是本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;二是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。
存储过程怎么用?
以下通过表T_Student来了解存储过程
无参数存储过程:
选出Student表中所有信息
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">Create Proc Proc_Student as //此处可以忽略不写 begin//begin和end是一对,不可以只写其中一个,但可以都不写。 select S#,Sname,Sage,Ssex, from T_Student end go</span></span></span>
有参数存储过程:
全局变量也称外部变量,是在函数的外部定义的,它的作用域从定义变量处开始,到本程序文件的末尾。
选出指定姓名的学生信息:
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">Create Proc Proc_Student @Sname varchar(100) as begin select * from T_Student where sname=@sname end go exec Proc_Student '赵雷'</span></span></span>
上面是在外部给变量赋值,也可以在内容给变量赋值。
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">create Proc Proc_Student @sname varchar(100)=‘赵雷’ as begin select S#,Sname,Sage,Ssex from student where sname=@sname end go exec Proc_Student</span></span></span>
也可以把变量的内容输出,使用output
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">create Proc Proc_Student @sname varchar(100), @IsRight int output //传出参数 declare @IsRight int //declare为内部声明变量的关键字 as if exists (select S#,Sname,Sage,Ssex from student where sname=@sname)//判断是否存在 set @IsRight =1 else set @IsRight=0 go exec Proc_Student '赵雷' , @IsRight output select @IsRight</span></span></span>
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">create Procedure Proc_Student @sname varchar(100), @IsRight int output //传出参数 declare @IsRight int //declare为内部声明变量的关键字 as if exists (select S#,Sname,Sage,Ssex from student where sname=@sname)//判断是否存在 set @IsRight =1 else set @IsRight=0 go exec Proc_Student '赵雷' , @IsRight output select @IsRight</span></span></span>
以上是全局变量,下面来了解局部变量
局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内部,离开该函数后再使用这种变量是非法的。
局部变量的定义:必须先用Declare命令定以后才可以使用,declare{@变量名 数据类型}
局部变量的赋值方法:set{@变量名=表达式}或者select{@变量名=表达式}
局部变量的显示:select @变量名
<span style="font-size:18px;"><span style="font-size:18px;">create Proc Proc_Student as declare @sname varchar(100) set @sname='赵雷' select S#,Sname,Sage,Ssex from student where sname=@sname go exec Proc_Student</span></span>