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

Posted sunnyjiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库中对存储过程的理解相关的知识,希望对你有一定的参考价值。

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]
AS 
SQL语句
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;
 
---------------------
作者:zmm198811
来源:CSDN
原文:https://blog.csdn.net/zmm198811/article/details/79966834
版权声明:本文为博主原创文章,转载请附上博文链接!




























以上是关于数据库中对存储过程的理解的主要内容,如果未能解决你的问题,请参考以下文章

在存储过程中对 DML 语句使用 EXECUTE IMMEDIATE

Oracle存储过程入门教程(通俗理解存储过程)

你能在 T-SQL 中对存储过程的结果进行选择吗

Oracle存储过程的理解

oracle中的存储过程有啥作用,该怎么理解?(数据更新的话用update语句不就完了吗)

对sqlserver存储过程合游标的一些理解