频道栏目
首页 > 资讯 > 其他综合 > 正文

数据库中关于对存储过程的理解

18-04-17        来源:[db:作者]  
收藏   我要投稿

1.存储过程的概念

存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集。经编译后存储在数据库中。

存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中。

存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量。

同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。

2.存储过程的优点

① 存储过程的能力大大增强了SQL语言的功能和灵活性。

存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的 运算。

② 可保证数据的安全性和完整性。

理由1:通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。

理由2:通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。

③ 在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。

这种已经编译好的过程可极大地改善SQL语句的性能。

由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。

④ 可以降低网络的通信量。

理由:客户端调用存储过程只需要传存储过程名和相关参数即可,与传输SQL语句相比自然数据量少了很多。

⑤ 使体现企业规则的运算程序放入数据库服务器中,以便:

1). 集中控制。

2). 当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。

企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序工作量非常之大(修改、发行和安装应用程序)。

如果把体现企业规则的运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可以了,应用程序无须任何变化。

3.存储过程的缺点

存储过程将给服务器带来额外的压力。

存储过程多多时维护比较困难。

移植性差,在升级到不同的数据库时比较困难。

调试麻烦,SQL语言的处理功能简单。

4.存储过程的种类

① 系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。

② 本地存储过程:用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。

③ 临时存储过程:分为两种存储过程:

一是本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;

二是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。

④ 远程存储过程:在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。

⑤ 扩展存储过程:扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。

5.存储过程的使用

传统软件行业大量使用存储过程。

程序写的数据逻辑效率不高,影响整体速度。在数据库资源足够的前提下,将压力放在数据库端是好选择。充分利用商业数据库庞大团队对数据库的各种优化。

比如ERP一类的软件,用户极少,但是业务复杂,数据量和数据复杂度极高,及时性和一致性要求极高。这种时候存储过程就派上大用场了。

大多数的互联网应用数据关系简单,业务简单。瓶颈一般在于数据库的读写,这些在存储过程话题中各位前辈已经描述的很清楚了。所以数据库要尽快读写,这时候所有其他的都尽量放在web服务器上来做,更省成本。

存储过程的困难在于对业务数据的理解和关系代数。写错了不好调试,技巧不足导致性能太差等等。

6.存储过程的创建

创建存储过程的语法如下:CREATE PROC[EDURE] 存储过程名@参数1 [数据类型]=[默认值] [OUTPUT]@参数2 [数据类型]=[默认值] [OUTPUT]ASSQL语句EXEC 过程名[参数]

6.1

create procedure pro_student

as select * from student;--执行不带参数的存储过程exec pro_student;

6.2

create proc proc_getStudentRecord

( @sex varchar(2) out, --输出参数 @age int output--输入输出参数)as select * from student where ssex = @sex and sage = @age;

相关TAG标签
上一篇:浏览器的自动填充功能真的安全吗?我看未必!
下一篇:全球顶尖黑客大赛GeekPwn又双叒出新花样!再掀黑客风云
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站