存储过程

本文介绍了存储过程的概念及其在SQL Server中的实现方式,包括创建、调用等,并通过一个新闻发布系统的实例展示了存储过程如何提高数据库操作效率。
          存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,是利用SQL Server所提供的Transact-SQL语言所编写的程序。经编译后存储在数据库中。存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量 。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。( http://baike.baidu.com/view/68525.htm

1、功能

这类语言主要提供以下功能,让用户可以设计出符合引用需求的程序:

1)、变量说明

2)、ANSI兼容的SQL命令(如Select,Update….)

3)、一般流程控制命令(if…else…、while….)

4)、内部函数

2、优点

1).存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

2).当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

3).存储过程可以重复使用,可减少数据库开发人员的工作量

4).安全性高,可设定只有某些用户才具有对指定存储过程的使用权

3、缺点

1).调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。

2).移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。

3).重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。

4).如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。

4、格式

CREATE PROCEDURE [拥有者.]存储过程名[;程序编号] 
[(参数#1,…参数#1024)] 
[WITH 
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION} 
] 
[FOR REPLICATION] 
AS 程序行

 

 

其中存储过程名不能超过128个字。每个存储过程中最多设定1024个参数

(SQL Server 7.0以上版本),参数的使用方法如下:

@参数名 数据类型 [VARYING] [=内定值] [OUTPUT]

每个参数名前要有一个“@”符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外,其他SQL Server所支持的数据类型都可使用。

[=内定值]相当于我们在建立数据库时设定一个字段的默认值,这里是为这个参数设定默认值。[OUTPUT]是用来指定该参数是既有输入又有输出值的,也就是在调用了这个存储过程时,如果所指定的参数值是我们需要输入的参数,同时也需要在结果中输出的,则该项必须为OUTPUT,而如果只是做输出参数用,可以用CURSOR,同时在使用该参数时,必须指定VARYING和OUTPUT这两个语句。

5、新闻发布系统中的实例

--=========================================
-- Author:          黄爱岗
-- Create date:     2011/5/16
-- Description:     取出最新10条新闻(所属分类、新闻标题、发布时间)
-- ========================================= 
CREATE PROCEDURE procNewsSelectNewNews
AS
BEGIN
         select top 10 n.id ,n.title,n.createTime,c.[name] from news n
         inner join category c on n.caId =c.id 
         order by n.createTime desc
END
GO
--=========================================
-- Author:             黄爱岗
-- Create date:        2011/5/16
-- Description:        取出10条热点新闻
-- =========================================
CREATE PROCEDURE news_selectHotNews
AS
BEGIN
      select top 10 n.id ,n.title,n.createTime,c.[name], COUNT(com.id) as comCount from news n
      inner join category c on n.caId =c.id 
      inner join comment com on com.newsId=n.id
      group by n.id, n.title, n.createTime, c.[name]
      order by comCount desc 
END
GO
--========================================= 
-- Author:                黄爱岗
-- Create date:         2011/5/16
-- Description:          根据类别ID取出该类别下的所有新闻
-- ========================================= 
CREATE PROCEDURE news_selectByCaId
@caid int
AS
BEGIN
      select n.id ,n.title,n.createTime,c.[name] from news n
      inner join category c on n.caId =c.id and n.caId=@caid
      order by n.createTime desc
END
GO
--======================================= 
-- Author:             黄爱岗
-- Create date:        2011/5/16
-- Description:        根据新闻ID取出新闻主题内容
-- =========================================
CREATE PROCEDURE news_selectById
@id int
AS
BEGIN
      select title,[content],createTime,caId from news where id=@id
END
GO
--=========================================
-- Author:             黄爱岗
-- Create date:        2011/5/16
-- Description:        根据内容搜索新闻
-- =========================================
CREATE PROCEDURE news_selectByContent
@content varchar(1000)
AS
BEGIN
      select top 10 n.id, n.title, n.createTime, c.[name] from news n
      inner join category c on n.caId=c.id
      where n.title like '%'+@content+'%'
      order by n.createTime desc
END
GO
--=========================================
-- Author:              黄爱岗
-- Create date:         2011/5/16
-- Description:         根据标题搜索新闻
-- =========================================
ALTER PROCEDURE [dbo].[news_selectByTitle]
@title varchar(100)
AS
BEGIN
      select top 10 n.id, n.title, n.createTime, c.[name] from news n
      inner join category c on n.caId=c.id
      where n.title like '%'+@title+'%'
      order by n.createTime desc
END
--=========================================
-- Author:              黄爱岗
-- Create date:         2011/5/16
-- Description:         增加新闻
-- =========================================
CREATE PROCEDURE news_insert
@title varchar(100),
@content text,
@caid int
AS
BEGIN
      insert into news(title,[content],caId)
      values (@title,@content,@caid)
END
GO
--=========================================
-- Author:              黄爱岗
-- Create date:         2011/5/16
-- Description:         修改新闻
-- =========================================
CREATE PROCEDURE news_update
@id int,
@title varchar(100),
@content text,
@caid int
AS
BEGIN
      update news
      set title=@title,[content]=@content,caId=@caid
      where id=@id
END
GO
--=========================================
-- Author:              黄爱岗
-- Create date:         2011/5/16
-- Description:         删除新闻
-- =========================================
CREATE PROCEDURE [dbo].[news_delete]
@id int
AS
BEGIN
      --先删除该新闻下的评论
      delete comment where newsId=@id
      --再删除新闻本身
      delete news where id=@id
END
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值