77范文网 - 专业文章范例文档资料分享平台

第7章 存储过程、触发器和用户自定义函数

来源:网络收集 时间:2018-12-10 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

第 7 章 存储过程、触发器和用户自定义函数(6课时)

主要内容:

1 存储过程(概述、创建与执行、修改与删除) 2 触发器(概述、DML触发器、DDL触发器)

3 用户自定义函数(概述、标量函数的建立与调用、内嵌表值函数的建立与调用、多语名表值函数的建立与调用)

存储过程是一个可重用的代码模块,可以高效率地完成指定的操作。触发器是一种特殊类型的存储过程,可以实现自动化的操作。用户定义函数是由用户根据应用程序的需要而定义的可以完成特定操作的函数。 这三种数据库对象都可以通过两种方法来定义:

? SQL Server Management Studio工具 ? 命令

这里只讨论通过命令的方式定义相应对象。 7.1 存储过程

7.1.1 存储过程概述 1 存储过程概念 当使用SQL Server创建应用时,TRANSACT-SQL语言是应用程序与SQL Server数据库之间的主要编程接口。使用TRANSACT-SQL语言进行程序设计时,有两种方式:一种方式是在应用程序中直接使用T-SQL语句向SQL Server发送命令;另一种方式就是使用存储过程。 存储过程是一种数据库对象,由一组预编译的T-SQL语句组成,这些语句在一个名称下存储,并作为一个单元进行处理。存储过程类似于其他编程语言中的函数或过程:能够使用传递给它的参数,能够调用其它存储过程甚至本身,能够返回一个状态码来表示是否成功执行。 在SQL Server 2008系统中,除了可以使用Transact-SQL语言编写存储过程外,也可以使用CLR方式编写存储过程。【CLR,公用语言运行时(Commen Language Runtime),.NET提供了一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作之间必要的分离。是一种多语言执行环境,支持众多的数据类型和语言特性。他管理着代码的执行,并使开发过程变得更加简单。】

SQL Server中有三类存储过程:系统存储过程(sp_为前缀)、用户自定义存储过程和扩展存储过程(xp_为前缀,扩展了SQL Server的功能,使得用户能调用外部例程(自已编写的程序或系统提供的命令),从SQL Server2005版本开始,将逐步删除扩展存储过程类型,因为使用CLR存储过程可以可靠和安全地替代扩展存储过程的功能)。 2 存储过程功能 在SQL Server中,存储过程是一种非常强有力的数据库对象,利用它能够显著提高应用程序的性能。主要功能表现在:

? 接收输入参数并以输出参数的形式为调用过程或批处理返回多个值; ? 包含对数据库操作的多条语句,可以调用其他存储过程;

? 为调用存储过程或批处理返回一个状态值,以表示执行状态。

3 存储过程的特点 ? 模块化编程。一旦创建了一个存储过程,就可以在应用程序中多次调用它,而且由

于存储过程独立于应用程序,所以可以在不影响应用程序源代码的前提下修改它。 ? 加快执行速度。在创建一个存储过程时,SQL Server要对它进行分析和优化,以获

得最好的执行性能;当一个存储过程被首次执行后,它就会驻留内存,当再次调用时,就不必再加载了,从而提高了整个系统的执行速度。 ? 减少网络通信量。使用存储过程,客户端的应用程序可以通过一条简单的执行命令

来执行存放在服务器端的存储过程,而不必传输成百上千行的SQL语句代码,因此可以大大减少网络阻塞。

? 提供安全机制。可以通过存储过程来间接将某些权限赋给用户。 ? 复杂业务规则和约束的一致性实现。存储过程足够强大,甚至能够实现最复杂的业

务规则,这是因为存储过程可以同时合并过程语句和面向集合的语句。

4 存储过程的数据返回方式 存储过程可以通过四种方式把数据返回到调用处:

? 输出参数。既可以返回数据(数值型或字符值等),也可以返回游标变量(游标是可

以逐行检索的结果集)。 ? 反回值。始终是整型值。

? 结果集。这些语句包含在该存储过程内或该存储过程所调用的任何其它存储过程

内。

? 全局游标。可从存储过程外引用的全局游标。

7.1.2 创建与执行存储过程 1 创建存储过程 简化语法:

CREATE PROCE[DURE] procedure_name [{@parameter data_type}[=default][output]][,...n] AS sql_statement […n] 其中,@parameter data_type 存储过程参数表,可以定义输入参数(默认)、输出参数output(即可输入数据,也可输出数据),也可以指明参数的默认值,默认值必须是常量或NULL。参数表中可以有0个或多个参数,多个参数之间用豆号分开。【输入参数:允许调用程序为存储过程传送数据值。输出参数:输出参数允许存储过程将数据值或游标变量传回调用程序,在定义时和调用时均要使用OUTPUT关键字。当然,也可以将变量的值通过输出参数输入到存储过程中。】 sql_statement 指定存储过程要执行的操作。 创建存储过程也要遵守一些规则,参见教材(p230-231)。 2 执行存储过程 在SQL Server 2008系统中,可以使用EXECUTE语句执行存储过程。简化语法: [ { EXEC[UTE ]} ] {

[ @return_status = ]

{ procedure_name }

[ [ @parameter = ] { value

| @variable [ OUTPUT ] | [ DEFAULT ] } ] [ ,...n ] } 如果要执行带有参数的存储过程,需要在执行过程中提供存储过程参数的值。如果使用@parameter_name=value语句提供参数值,可以不考虑存储过程的参数顺序,否则如果直接提供参数值,则必须考虑参数顺序。 存储过程创建之后,在第一次执行时需要经过语法分析阶段、解析阶段、编译阶段和执行阶段。 语法分析阶段。是指系统检查创建存储过程的语句的语法是否正确的过程。语法检查通过之后,系统将把存储过程的定义存储在当前数据库的sys.sql_modules目录视图中。 解析阶段。是指检查存储过程引用的对象名称是否存在的过程,该过程也被称为延迟称称解析阶段。当然,只有引用的表对象才适用于延迟名称解析。 编译阶段。是指分析存储过程和生成执行计划的过程。优化后的执行计划置于过程高速缓冲存储区中。 执行阶段。是指执行驻留在过程高速缓冲存储区中的存储过程执行计划的过程。 在以后的执行过程中,如果现有的执行计划依然驻留在过程高速缓冲存储区中,那么SQL Server将重用现有执行计划。 当存储过程引用的基表发生结构变化时,该存储过程的执行计划将会自动优化。但是当在表中添加了索引或更改了索引列中的数据后,该执行计划不会自动优化,此时应该重新编译存储过程。可以使用三种方式重新编译存储过程:

? 使用sp_recompile系统存储过程;

? 在EXECUTE语句中使用WITH RECOMPILE子句;

? 在CREATE PROCEDURE语句中使用WITH RECOMPILE子句。 3 存储过程的创建与执行实例 例1:查找指定日期后签定的订单(创建有返回结果集的存储过程)

use Northwind go

if OBJECT_ID('p1','p') is not null go

create procedure p1 go

@datex datetime

select * from orders where orderdate>=@datex as

drop procedure p1

********************************************

use Northwind

execute p1 '1997-1-1'

go

例2:求产品的平均单价(创建有返回参数的存储过程)

use Northwind

if OBJECT_ID('p2','p') is not null go

create procedure p2 as go

select @avgprice=avg(unitprice) from products @avgprice money output drop procedure p1

***********************************

use Northwind declare @x money execute p2 @x output select @x

例3:判断是否有1997年2月20号签定的订单,有返回0,没有返回1(创建有返回值的存储过程)

use Northwind go

if OBJECT_ID('p3','p') is not null go

create procedure p3 as

if exists(select * from orders where orderdate=@datex) go

return 0 return 1 else

@datex datetime drop procedure p1

****************************************************

use Northwind declare @x int

execute @x=p3 '1997-2-20' select @x

go

例4:根据最后姓名模糊查找职员信息(创建带有缺省值参数的存储过程)

use Northwind

if OBJECT_ID('p4','p') is not null

drop procedure p1

go

create procedure p4 as go

select * from employees where lastname like @namex+'%' @namex nvarchar(20)='D%'

******************************************

use Northwind execute p4 execute p4 'B'

7.1.3 修改存储过程 在Microsoft SQL Server 2008系统中,可以使用ALTER PROCEDURE语句修改已经存在的存储过程。修改存储过程,不是删除和重建存储过程,其目的是保持存储过程的权限不发生变化。简化语法如下: ALTER PROCE[DURE] procedure_name [{@parameter data_type}[=default][output]][,...n] AS sql_statement […n]

7.1.4 删除存储过程 如果某个存储过程不再需要了,可以使用DROP PROCEDURE语句删除该存储过程。具体语法是: DROP PROCEDURE procedure_name 7.2 触发器

7.2.1触发器概述

触发器是数据库服务器中发生事件时能自动执行的一种特种存储过程,主要用于强制规则和数据完整性。触发器是通过事件触发而自动执行的,不能被直接调用执行。

根据触发事件的不同,触发器分为两种类型。由DML触发的是DML触发器,由DDL触发的是DDL触发器(DDL触发器是从SQL Server 2005版开始新增的,分为数据库级的DDL触发器和服务器级的DDL触发器)。

在SQL Server 2008系统中,除了可以使用Transact-SQL语言编写触发器外,也可以使用CLR方式编写触发器。 7.2.2 DML触发器 1 DML触发器概述 DML触发器是和数据库中的表相关的,当对表进行INSERT、UPDATE、DELETE操作时,将触发相应的触发器。在SQL Server中,按照触发器和触发事件的执行时间的先后顺序划分,有两类DML触发器,一类是标准(After)触发器,另一类是新的Instead-of触发器。 当触发事件(INSERT、UPDATE、DELETE)执行之后才执行触发器操作,这时的触发器类型是AFTER触发器。AFTER触发器只能在表上定义。如果想要使用触发器操作替代

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第7章 存储过程、触发器和用户自定义函数在线全文阅读。

第7章 存储过程、触发器和用户自定义函数.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/356429.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: