【机房重构个人版】存储过程的使用

来源:互联网 发布:武汉软件新城派出所 编辑:程序博客网 时间:2024/06/04 19:37

       存储过程(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_Studentas //此处可以忽略不写begin//begin和end是一对,不可以只写其中一个,但可以都不写。select S#,Sname,Sage,Ssex, from T_Studentendgo</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)asbeginselect * from T_Student where sname=@snameendgoexec 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 beginselect S#,Sname,Sage,Ssex from student where sname=@snameendgoexec 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 =1elseset @IsRight=0goexec Proc_Student '赵雷' , @IsRight outputselect @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 =1elseset @IsRight=0goexec Proc_Student '赵雷' , @IsRight outputselect @IsRight</span></span></span>


以上是全局变量,下面来了解局部变量
局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内部,离开该函数后再使用这种变量是非法的。
局部变量的定义:必须先用Declare命令定以后才可以使用,declare{@变量名 数据类型}
局部变量的赋值方法:set{@变量名=表达式}或者select{@变量名=表达式}
局部变量的显示:select @变量名

<span style="font-size:18px;"><span style="font-size:18px;">create Proc Proc_Studentas declare @sname varchar(100)set @sname='赵雷'select S#,Sname,Sage,Ssex from student where sname=@snamegoexec Proc_Student</span></span>




0 0
原创粉丝点击