存储过程一般用于处理比较复杂的任务,基础ms这个平台,可以大大降低耗时,其编译机制也提高了数据库执行速度。
当然在系统控制方便方面,例如当系统进行调整时,这是只需要将后台存储过程进行更改,而不需要更改客户端程序。也无需重新安装客户端应用程序。
存储过程不仅仅适用于大型项目,对于中小型项目,使用存储过程也是非常有必要的。其威力和优势主要体现在:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
(这涉及到原理性的问题,你记住就好!)
2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
(尽可能少的连接数据库,可以减少时间损耗;事务方面在批量操作中非常重要,因为事务可以回溯,当出错时,可以进行回溯,保证数据的完整性!)
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
(体现在分页存储过程,以及下面这个例子:)
例子:create PROC [dbo].[jobs_public_select]
@TableName VARCHAR(2000),/*表名*/
@ParamName VARCHAR(2000),/*查询字段字符串*/
@ParamWhere NVARCHAR(2000)/*条件字符串*/
AS
BEGIN
Declare @SQL varchar(500)
set @SQL='SELECT '+@ParamName+' from '+@TableName+' WHERE 1=1'
IF @ParamWhere<>''
BEGIN
SET @SQL=@SQL+@ParamWhere
END
exec(@SQL)
END
(这个例子主要作用就是公共查询功能,你只需要传递表名,查询的字段,条件即可。你可以以此类推,写个公共删除,公共更新的;操作无非也这几种哈。)
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
(这方面在赋权限,主要体现在,连接时采用哪个用户连接数据库,而对应的这个用户也有对应的数据库操作权限。)
优点:
1.速度快。尤其对于较为复杂的逻辑,减少了网络流量之间的消耗
我有的过程和函数达到了几百行,一个微型编译器,相信用程序就更麻烦了。
(在获取权限那个存储过程深有体会,你也可以写个C#的算法,然后与存储过程进行速度比较。)
2.写程序简单,采用存储过程调用类,调用任何存储过程都只要1-2行代码。
(我不知道别人怎么调用,我是深受其益)
3.升级、维护方便(你只需要更改存储过程就好,比如添加一个字段等)
4.调试其实也并不麻烦,可以用查询分析器(基础好,一般没有遇到很大的错误!)
5.如果把所有的数据逻辑都放在存储过程中,那么asp.net只需要负责界面的显示阿什么的,出错的可能性最大就是在存储过程。我碰到的就一般是这种情况。
(减少了排错的时间)
缺点:
1.可移植性差,我一直采用sql server开发,可是如果想卖自己的东西,发现自己简直就是在帮ms卖东西,呵呵。想换成mysql,确实移植麻烦。
2.采用存储过程调用类,需要进行两次调用操作,一次是从sql server中取到过程的参数信息,并且建立参数;第二次才是调用这个过程。多了一次消耗。
不过这个缺点可以在项目开发完成,过程参数完全确定之后,把所有过程参数信息倒入到一个xml文件中来提高性能。
当一个业务同时对多个表进行处理的时候采用存储过程比较合适。
1. 使用存储过程在一般情况下会提高性能,因为数据库优化了存储过程的数据访问计划并应用缓存方便以后的查询;
2. 存储过程单独保护存在于数据库中。客户端可以获取权限执行存储过程,而不需要对底层的具体表设置其他的访问权限;
3. 存储过程会使得维护起来更加方便,因为通常修改一个存储过程要比在一个已经发布的组件中修改SQL语句更加方便;
4. 存储过程给底层数据格式增添了额外的抽象层。使得使用存储过程的客户端对存储过程的实现细节以及对底层数据格式是隔离独立的;
5. 存储过程能够缓解网络带宽,因为可以批量执行SQL语句而不是从客户端发送超负载的请求。
复杂的数据处理用存储过程,如有些报表处理
多条件多表联合查询,并做分页处理
总结:
1. 当一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时就要考虑用存储过程;
2. 当在一个事务的完成需要很复杂的商业逻辑时(比如,对多个数据的操作,对多个状态的判断更改等)要考虑;
3. 还有就是比较复杂的统计和汇总也要考虑,但是过多的使用存储过程会降低系统的移植性。
分页例子:
create procedure [dbo].[sp_super_page]
@TableName varchar(5000), --要进行分页的表,也可以用联接,如dbo.employee或dbo.employee INNER JOIN dbo.jobs ON (dbo.employee.job_id=dbo.jobs.job_id)
@Fields varchar(5000), --表中的字段,可以使用*代替
@OrderField varchar(5000), --要排序的字段
@sqlWhere varchar(5000), --WHERE子句
@pageSize int, --分页的大小
@pageIndex int, --要显示的页的索引
@TotalPage int output, --页的总数
@TotalRecords int output--信息总条数
as
begin
Begin Tran
Declare @sql nvarchar(4000);
Declare @totalRecord int; --记录总数
if (@sqlWhere IS NULL or @sqlWhere = '')
--在没有WHERE子句的情况下得到表中所有的记录总数
set @sql = 'select @totalRecord = count(*) from ' + @TableName
else
--利用WHERE子句进行过滤
set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere
--执行sql语句得到记录总数
EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT
select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)
--根据特定的排序字段为为行分配唯一ROW_NUMBER的顺序
if (@sqlWhere IS NULL or @sqlWhere = '')
set @sql = 'select * from (select ROW_NUMBER() over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName
else
set @sql = 'select * from (select ROW_NUMBER() over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere
--确保当前页的索引在合理的范围之内
if @PageIndex<=0
Set @pageIndex = 1
if @pageIndex>@TotalPage
Set @pageIndex = @TotalPage
--得到当前页在整个结果集中准确的ROW_NUMBER值
Declare @StartRecord int
Declare @EndRecord int
set @StartRecord = (@pageIndex-1)*@PageSize + 1
set @EndRecord = @StartRecord + @pageSize - 1
--输出当前页中的数据
set @Sql = @Sql + ') as t' + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord)
Exec(@Sql)
If @@Error <> 0
Begin
RollBack Tran
SET @TotalRecords=-1
End
Else
Begin
Commit Tran
SET @TotalRecords=@totalRecord
End
end
相关推荐
### PL/SQL中存储过程的建立、导出、导入与使用 #### 一、存储过程的概念及优势 存储过程是一种数据库对象,它是由一系列SQL语句组成的预编译的程序块,存储在数据库中,可以通过调用的方式执行。在Oracle数据库中...
一、什么是MySQL存储过程? 在大型项目中,有时候需要重复执行能够完成特定功能的SQL语句集,而MySQL为我们提供了存储过程的概念,存储过程是数据库中的一个重要对象,它是存储在数据库中的一组完成特定功能的...
什么时候需要用存储过程: 1. 在服务器上执行存储过程,可以改善应用程序的性能。这是因为服务器往往具有强大的计算能力和速度。 2. 避免把大量的数据下载到客户端,减少网络上的传输量。 系统存储过程: 1. sp_...
标题中的“什么时候使用存储过程比较适合”是一个关于数据库管理和优化的话题。存储过程是数据库系统中预编译的SQL语句集合,通常用于执行复杂的数据库操作。以下是对存储过程适用场景和优缺点的详细阐述: **适合...
存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。在Oracle中,若干个有联系的过程可以组合在一起构成程序包。 使用存储过程有以下的优点: ...
Oracle 定时执行存储过程是一种高效的方式来执行存储过程,通过使用 Oracle 提供的 job 机制来实现。Job 机制允许开发者创建、计划和执行存储过程,实现自动化和批量处理。 Broken() 过程 Broken() 过程用于更新...
存储过程是预编译的SQL语句集合,储存在数据库服务器中,用于执行特定任务。以下是对何时使用存储过程及其优缺点的详细说明: **适用场景:** 1. **多表操作**:当一个业务操作涉及到对多个数据库表的操作,如更新...
使用存储过程可以完成所有数据库操作,并可通过编程方式控制上述操作对数据库信息访问的权限。 创建存储过程 创建存储过程可以使用CREATE PROCEDURE语句 语法格式: CREATE PROCEDURE sp_name ([proc_parameter[,......
然而,有时候,由于维护、审计或交接工作等原因,我们需要访问这些加密的存储过程内容。这就引出了“SQL Server存储过程解密工具”的需求。 "SQL Server存储过程解密工具"是一款专门设计用于解密已加密的SQL Server...
SQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集,它可以被命名并保存,然后在需要的时候调用,极大地提高了SQL代码的重用性和执行效率。在这个实例中,我们看到一个名为`Sum_wage`的存储过程,它的...
游标的使用使得存储过程能更灵活地处理数据。 **动态SQL语句** 动态SQL是指在运行时构建和执行SQL语句。在DB2存储过程中,可能需要根据某些条件或变量来构造不同的SQL命令。动态SQL允许我们创建字符串形式的SQL语句...
当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。 Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在...
Postgresql存储过程是指在Postgresql数据库中定义的一组SQL语句的集合,它可以完成复杂的操作,并且可以重复使用。Postgresql存储过程可以用来实现业务逻辑,减少数据库服务器的压力和网络传输的数据量。 一、存储...
在使用SQL Server进行数据库管理的过程中,有时会遇到“未能找到存储过程”的错误提示,例如:“未能找到存储过程'Ws_UserPro_LoginCheck'”。这个问题通常是由于数据库中缺少相应的存储过程所导致的,可能是因为误...
存储过程会使用这两个参数来计算出数据的开始位置和结束位置,然后通过SQL查询语句(如`SELECT`)来获取相应的数据行。 一个简单的分页存储过程可能包含以下步骤: 1. 计算起始位置:`(@PageIndex - 1) * @PageSize...
在Java开发中,有时我们需要与数据库进行深度交互,这时候存储过程就显得尤为重要。特别是当涉及到复杂的业务逻辑或者数据处理时,Oracle数据库中的存储过程能够提供更高效和安全的解决方案。本话题将详细讲解如何...
2. **调用方式**:存储过程可以通过`EXEC`或`EXECUTE`命令进行调用,这使得开发者能够在需要的时候轻松地复用这段代码。 3. **功能多样**:存储过程可以执行复杂的逻辑处理,比如根据条件执行不同的SQL语句,甚至...
标题“关于有返回值的存储过程”着重提到了具有返回值这一特性,这通常指的是存储过程可以返回一个或多个结果以供后续操作使用。 存储过程具有返回值的主要好处包括提高性能、增强安全性、降低网络流量以及提供更好...
在开发Oracle应用程序时,经常需要使用到存储过程和函数。这两种类型的数据库对象各有优势,可以满足不同的业务需求。有时候,为了更好地组织代码和提高复用性,我们可能会考虑在函数内部调用一个存储过程。这种做法...
在数据库管理中,分页查询是一项常见的操作,特别是在数据量庞大的时候,为了提高用户体验和页面加载速度,通常会采用分页展示数据。本篇将详细解释如何创建一个高效的分页存储过程,以及其中涉及的关键技术点。 ...