第9章 存储过程的创建与使用课件.ppt
《第9章 存储过程的创建与使用课件.ppt》由会员分享,可在线阅读,更多相关《第9章 存储过程的创建与使用课件.ppt(74页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、SQL SERVER应应 用用 与与 开开 发发计算机工程技术学院(软件学院) 任淑美二00七年十一月(九)(九)本课主要内容本课主要内容 存贮过程概述创建存储过程执行存储过程查看和修改存储过程常用的系统存储过程本课核心知识点本课核心知识点利用T-SQL创建存储过程存贮过程的执行存贮过程的重新编译 本课重点难点本课重点难点在存贮过程中使用参数重新编译存贮过程 本课教学目的本课教学目的了解存储过程的概念和优点,能够在您的实际应用中设计合适的存储过程理解存储过程的类型,掌握一定数量的系统存储过程掌握如何创建和执行存储过程。掌握管理存储过程的方法。 第第9章章 存储过程的创建和使用存储过程的创建和使
2、用 顾名思义,存储过程就是存储在SQL SERVER服务器中的一组编译成单个执行计划的T-SQL语句。 9.1 概述概述 存储过程存储在数据库内,可由应用程序通过调用执行。使用存储过程不但可以提高T-SQL的执行效率,而且可以使对数据库的管理、以及实现应用复杂的业务更客易。存储过程也可看作是一种没有返回值的特殊函数,它与函数的区别是:函数有返回值,其返回值可以直接在表达式、计算列中使用;而存储过程只能调用执行,它不能通过名称得到返回值,也不能直接在表达式、计算列中使用。 9.1.1 理解存储过程的概念理解存储过程的概念 存储过程是SQL语句和可选控制流语句的预编译集合,以一个名称存储并作为一个
3、单元处理,其中可包含程序流、逻辑以及对数据库的查询,存储过程可以包含一条SELECT语句,也可包含一系列使用控制流的SQL语句,如图9-1所示。它们还可接受参数、返回输出参数、返回状态值,主要用来执行管理任务或实现应用复杂的业务规则。 。9.1.2 理解存储过程的优点理解存储过程的优点 使用存储过程与本地的Transact-SQL程序相比有如下好处: 1简化用户操作存储过程将一系列复杂的T-SQL代码封装在一起,作为数据库对象存放于数据库服务器内,用户使用时不必思考复杂的T-SQL语句而只需调用存储过程即可得到所需结果,简化了用户操作。2执行效率更高存储过程已被编译,执行时不再花费编译与优化时
4、间。另外,一个存储过程在执行一次之后,其执行规划就被自动缓存到内存中,以后使用时就可直接从内存中获取。这不同于T-SQL语句,每次运行时都要从客户端重复发送,并由SQL SERVER进行编译和优化。在需要大量T-SQL代码或需重复执行时,存储过程比T-SQL批代码的执行要快。 3减少网络流量特别对于复杂的商业业务计算,例如计算用户的每月应交电费,如采用T-SQL实现,则需要大量的T-SQL语句和中间数据在客户机与SQL SERVER服务器之间的网络通道上传送;采用存储过程实现,则只需由一条执行存储过程的单独语句就可实现,大大减少网络流量。4提高系统安全性可作为安全机制使用。通过适当的权限设置,
5、可以使系统的安全性得到有效保障。5允许模块化程序设计存储过程可以封装企业的功能模块,这种企业的功能模块也为商业规则或者商业策赂,可以只创建一次并将其存储在数据库中,以后即可在程序中调用该过程任意次,而且可以统一修改。9.1.3 掌握存储过程的分类掌握存储过程的分类 存储过程分为两大类:系统存储过程和用户自定义存储过程。系统存储过程:由系统定义的存储过程,存放在master数据库中,类似C语言中的系统函数。系统存储过程的名称都以“sp_”开头或”xp_”开头,主要用于系统管理、登录管理、查看数据库信息、数据复制等操作。用户自定义存储过程:由用户在自己的数据库中创建的存储过程,类似C语言中的。用户
6、自定义函数。可根据不同的分类标准予以分类:(1)临时存储过程。是以存储过程名、开头的存储过程。其生命周期与一般的局部临时变量、全局临时变量的生命周期相同。(2)本地存储过程。用户创建并存放在用户当前连接的SQL SERVER数据库中的存储过程, 是我们通常意义上的存储过程。(3)扩展存储过程。是利用高级语言(如DELPHI和C+等)编写的存储过程。实际是包含在一个WIn32.DLL中的一个函数。只有那些可以独立创建DLL和EXE文件的高级程序语言可用来创建扩展存储过程。 9.2 创建存储过程创建存储过程 在当前数据库创建的用户自定义本地存储过程,不包括扩展存储过程。创建存储过程的方法共有三种:
7、n 使用企业管理器n 使用T-SQL语句n 使用创建存储过程向导9.2.1 利用企业管理器创建存储过程利用企业管理器创建存储过程 可使用企业管理器创建存储过程。(1)启动SQL SERVER企业管理器,依次单击控制台树上的【服务器组】【服务器】【数据库】【要创建存储过程的数据库】右击【存储过程】,在弹出的快捷菜单中单击【新建存储过程】,如图所示。(2)弹出存储过程属性对话框,如图所示。(3)在“文本”框中输入存储过程。包括修改存储过程名, 并在”AS”后输入存储过程内容。(4)单击【检查语法】按钮,检查所输入的SQL语句语法的是否正确。(5)单击【确定】按钮,创建该存储过程。9.2.2 使用使
8、用Transact-SQL语言创建存储过程语言创建存储过程用CREATE PROCEDURE语句创建存储过程。语法格式语法格式:CREATE PROC EDURE 存储过程名 ; number 参数 数据类型 VARYING = 默认值 OUTPUT ,.n WITH RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION FOR REPLICATION AS Sql语句 .n 参数说明:参数说明:存储过程名:新存储过程的名称。;number:是可选的整数,用来对同名的过程分组,以便用一条 DROP PROCEDURE 语句即可将同组的过程一起除去。默认
9、值:参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。OUTPUT:表明参数是返回参数。将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。N:表示最多可以指定 2.100 个参数的占位符。RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION:RECOMPILE: 表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 RECOMPILE 选项。ENCRYPTION: 表示 SQL Server 加密 syscom
10、ments 表中包含 CREATE PROCEDURE 语句文本的条目。使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。FOR REPLICATION:指定不能在订阅服务器上执行为复制创建的存储过程。.使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。本选项不能和 WITH RECOMPILE 选项一起使用。1创建带有复杂 SELECT 语句的简单过程【例9-1】创建存储过程,返回所有帖子信息。这些帖子信息要求显示编号的意义。如:发帖人不使用用户编号,而使用发帖人的昵称;帖子所在版块不使用版块编号,而显示版
11、块名。 【分析】:(1)使用CREATE PROCEDURE语句创建存储过程,该存储过程无输入参数、输出参数。 (2)帖子信息存放于TOPIC表,发帖人信息存放于USERS表,版块信息存放于SECTION表, 三张表作联接查询。代码如下:USE bbsdbGOCREATE PROCEDURE p_topic_all ASSELECT TID, TSID, Users.UName, TReplyCount, TEmotion, TTopic, TContents, TTime, TClickCount, TFlag, TlastClickT, SECTION.SNAMEFROM Topic IN
12、NER JOIN Users ON TUID = Users.UIDINNER JOIN SECTION ON TSID = SECTION.SIDGO执行上述T-SQL便可创建存储过程,创建成功的存储过程可由SQL的EXECUTE调用,也可由前端开发语言(DELPHI, C#, JAVA等)通过数据库接口(如OLD DB)的方法调用。p_topic_all存储过程可以通过以下方法执行:USE bbsdbGOEXECUTE p_topic_all- 或EXEC p_topic_allGO注意注意:T-SQL允许有选择地使用一个名称和数字区分一个存储过程(例如,p_topic_all;1)。当执
13、行用数字创建的存储过程时,也必须包括该数字。虽然这种方法允许在一个Drop Procedure语句中删除有相同名称(和不同数字)的全部过程,但是实践汪明,这种命名不好。建议对于全部存储过程使用唯一的描述名(不包括数字)2创建带有参数的简单存储过程【例9-2】创建存储过程,除【例9-1】的要求(不显示代码,需要显示代码意义)外, 还要求只返回指定某版块编号的帖子信息。 【分析】:(1)创建存储过程,该存储过程有输入参数“版块编号”,无输出参数。 (2)帖子信息存放于TOPIC表,发帖人信息存放于USERS表,版块信息存放于SECTION表, 三张表作联接查询,增加条件过滤。 代码如下:USE b
14、bsdbGOCREATE PROCEDURE p_topic_by_sid SID INT ASSELECT TID, TSID, Users.UName, TReplyCount, TEmotion, TTopic, TContents, TTime, TClickCount, TFlag, TlastClickT, SECTION.SNAMEFROM Topic INNER JOIN Users ON TUID = Users.UIDINNER JOIN SECTION ON TSID = SECTION.SID WHERE SECTION.SID = SIDGOp_topic_by_si
15、d存储过程可以通过以下方法执行:USE bbsdbGOEXEC p_topic_by_sid 2- OrEXEC p_topic_by_sid 23使用 OUTPUT 参数创建带有输出参数的存储过程【例9-3】创建存储过程,除【例9-1】, 【例9-2】的要求(不显示代码,需要显示代码意义;返回指定版块编号的帖子信息)外,还要求返回指定版块的发帖总页数,以及该版块第1页的帖子信息(假设版块帖子数很多)。【分析】:(1)创建存储过程,该存储过程有输入参数“版块编号”,有输出参数“页数”。 (2)帖子信息存放于TOPIC表,发帖人信息存放于USERS表,版块信息存放于SECTION表, 三张表作联
16、接查询,增加条件过滤。(3)页数帖子总数/每页的帖子数N(N可考虑使用输入参数指定),并取整(使用函数CEILING)。(4)该版块第1页的帖子信息, 即前面的N行,这样,需要动态构建SQL, 并执行。代码如下:USE bbsdbGOCREATE PROCEDURE p_topic_by_sid1SID INT, Pages INT output, RowsOfPage INT AS-获取该版块的页数SELECT Pages = ceiling(count(*)*1.0/RowsOfPage)FROM TopicWHERE TSID = SID-获取该版块的该版块第1页的帖子信息DECLARE
17、 sql varchar(8000)SET sql = select TOP + convert(varchar(5), RowsOfPage) + TID, TSID, Users.UName, TReplyCount, TEmotion, TTopic, + TContents, TTime, + TClickCount, TFlag, TlastClickT, SECTION.SNAME + FROM Topic INNER JOIN Users ON TUID = Users.UID + INNER JOIN SECTION ON TSID = SECTION.SID + WHERE
18、SECTION.SID = + convert(varchar(10), SID)EXEC(sql)GOp_topic_by_sid存储过程可以通过以下方法执行:USE bbsdbGODECLARE cnt intEXEC p_topic_by_sid1 2, cnt OUTPUT, 20 -存储过程执行时,也带OUTPUTPrint cnt4输入参数的默认值上述【例9-3】确实比较方便,调用者可随时改变每页显示的帖子数。但通常情况下,系统每页显示20张帖子,调用者也需要在严格按照上述调用方法,这样就较麻烦。思考思考:能不能在不指定每页的帖子数时,系统用最常规的每页显示20来调用执行呢? 答案
19、是肯定的。如果当调用存储过程时没有提供参数,可以定义一个缺省的输入值。具体方法是:CREATE PROC 存储过程名 parameter data_type = 默认值, AS 如上述问题的解决, 可修改上例。【例9-4】使用默认值调用存储过程。USE bbsdbGOCREATE PROCEDURE p_topic_by_sid2SID INT,PagesINT output,RowsOfPage INT=20 AS-获取该版块的页数SELECT Pages = ceiling(count(*)*1.0/RowsOfPage)FROM TopicWHERE TSID = SID-获取该版块的该
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第9章 存储过程的创建与使用课件 存储 过程 创建 使用 课件
限制150内