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