机房收费系统VB.NET版——存储过程的使用
存储过程(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#,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#,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 output select @IsRight</span></span></span> 以上是全局变量,下面来了解局部变量 <span style="font-size:18px;"><span style="font-size:18px;">create Proc Proc_Student as declare @sname varchar(100) set @sname='赵雷' select S#,Ssex from student where sname=@sname go exec Proc_Student</span></span> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 链路聚合转发包的算法
- 删除除数字,字母x和加号(正则表达式,PHP)之外的所有内容
- C-将结构数组设置为null
- c# – ASP.NET动态数据:如果在Page.Initialized事件上访问
- 来自不同文件的Powershell XML importnode
- ruby-on-rails – Ruby / RoR:通过super()调用原始方法?
- C++之下载Visual Studio Installer缓慢问题
- ruby-on-rails – Rails – 失去与Integration Tests和Capy
- 为现有的PostgreSQL索引添加唯一约束
- (译)如何优化cocos2d程序的内存使用和程序大小:第一部分