视图、存储过程、函数、游标与触发器.ppt
《视图、存储过程、函数、游标与触发器.ppt》由会员分享,可在线阅读,更多相关《视图、存储过程、函数、游标与触发器.ppt(67页珍藏版)》请在三一办公上搜索。
1、视图、存储过程、函数、游标与触发器,学习目标,掌握使用视图掌握使用存储过程掌握使用自定义标量函数、表值函数掌握使用游标掌握使用触发器,一、视图的定义,视图由SELECT查询语句所定义的一个虚拟表,是查看数据的一种非常有效的方式,同真实的数据表一样,视图也包含一系列带有名称的数据列和数据行,但视图与数据表又有很大的不同,视图中的数据并不真实的存在于数据库中。,1.1、视图的优点,简化查询提供一种安全机制视图掩码(对长的字段重新命名)数据即时更新,1.2、视图的分类,标准视图:使用最频繁的视图,不存储任何数据,不占用任何存储空间索引视图:拥有唯一群集索引的视图被称为索引视图,它存储真实索引数据,占
2、用一定的存储空间。分区视图:现在用分区表进行替代,1.2.1、标准视图,-创建带有部门编号的emp视图SELECT dbo.EMP.EMPNO,dbo.EMP.ENAME,dbo.EMP.JOB,dbo.EMP.MGR,dbo.EMP.HIREDATE,dbo.EMP.SAL,dbo.EMP.COMM,dbo.EMP.DEPTNO,dbo.DEPT.DNAMEFROM dbo.EMP INNER JOIN dbo.DEPT ON dbo.EMP.DEPTNO=dbo.DEPT.DEPTNO-通过视图修改数据update v_emp_with_deptname set sal=800 where
3、 empno=7369注意:(1)可以修改基于两个或两个以上基表的视图,但是每次修改只能影响一个基表,不能同时修改。(2)不能修改通过计算得到的列、有内置函数的列以及有聚合函数的列,1.2.2、索引视图,-创建各部门人数的视图drop view v_countOfDeptgocreate view v_countOfDept WITH SCHEMABINDING asSELECT EMP.deptno,count_big(*)empcountFROM dbo.EMPgroup by emp.deptno-创建聚合索引CREATE UNIQUE CLUSTERED INDEX i_v_count
4、OfDept_deptno ON v_countOfDept(deptno)注意:(1)创建索引视图,必须拥有唯一聚合索引,如果创建聚合索引,带有聚合函数的基础视图必须使用WITH SCHEMABINDING,group by以及count_big函数(2)使用索引视图能提高数据库效率(3)如果视图引用任何非确定性函数,则不能在视图上创建聚集索引,1.2.3、分区视图,-创建分区视图-将表进行行分割,emp表分解为emp1和emp2select*into emp1 from emp where empno=7782goCREATE VIEW v_emp_with_1_and_2ASSELECT
5、*FROM emp1UNION ALLSELECT*FROM emp2注意:分区视图在sqlserver2005中被分区表替代,1.3、在Management Studio中创建视图,二、存储过程,存储过程是数据库系统中封装的代码模块,它采用T-SQL语言来编写,经编译后存放在数据库服务器中,具有很好的可重用性,可用于高效地完成某些操作存储过程可以充分利用服务器的高性能运算能力,无需把大量的结果集送往客户端进行处理,大大减少了网络数据传输的开销,提高了应用程序访问数据库的速度和效率,2.1、使用存储过程的好处与特点,存储过程是已编译过的,并在服务器上注册和保存的代码模块,因而比一般的程序语句执
6、行起来速度更快,同时减少了网络流量,节省了大量时间和数据流量。存储过程可以使用控制语句和变量,并且在一个存储过程中可以调用其他存储过程,使得用户可以进行模块化程序设计,大大提高了用户设计程序的效率。存储过程具有安全特性和所有权链接,可以执行所有的权限管理,用户可以被授予执行存储过程的权限,但不拥有直接对存储过程所引用对象的权限。存储过程可以提高应用程序的安全性,防止SQL嵌入式攻击存储过程可以允许代码绑定,引用当前不存在的对象,这些对象仅在存储过程执行时存在,2.2、存储过程的分类,用户自定义的存储过程:最主要的存储过程系统存储过程:sp_前缀,系统预定义扩展存储过程:保存在DLL动态链接库中
7、并从动态链接库中执行的C+程序代码,用于扩展SQLSERVER2005性能,以字符xp_开头,通常与其它系统存储过程一起使用通过程序集调用。,2.3、存储过程的设计规则,CREATE PROCEDURE 定义本身可包括除下列 CREATE 语句以外的任何数量和类型的 SQL 语句,存储过程中的任意地方都不能使用下列语句:CREATE RULECREATE DEFAULTCREATE FUNCTIONCREATE TRIGGERCREATE PROCEDURECREATE VIEWUSE DATABASE,2.4、创建存储过程的语法,CREATE PROC|PROCEDURE schema_na
8、me.procedure_name parameter type_schema_name.data_type OUTPUT,.n AS,2.5 创建和使用存储过程,-创建不带参数的存储过程if exists(select name from sysobjects where name=pro_name and type=p)drop procedure pro_nameGocreate procedure pro_nameas declare v_name varchar(10),v_sal decimal(10,2)beginbegin try select v_name=ename,v_s
9、al=sal from emp where empno=7369 if v_sal2500 print 工资超过2500 else print 工资少于2500end try begin catchprint 错误号:+cast(error as varchar(10)print 错误内容:+error_message()end catch end-使用存储过程exec pro_name注意:Sysobjects:系统中的所有对象,包括:表、存储过程、触发器等等Type=p 类型为存储过程,其他如:s系统对象,u用户表,v变量,tr触发器等等,-创建带输入参数的存储过程if exists(se
10、lect name from sysobjects where name=pro_name and type=p)drop procedure pro_nameGocreate procedure pro_name vempno intas declare v_name varchar(10),v_sal decimal(10,2)beginbegin try select v_name=ename,v_sal=sal from emp where empno=vempno if v_sal2500 print 工资超过2500 else print 工资少于2500end try begin
11、 catchprint 错误号:+cast(error as varchar(10)print 错误内容:+error_message()end catch end-使用存储过程pro_name 7369,-创建带输出参数的存储过程if exists(select name from sysobjects where name=pro_name and type=p)drop procedure pro_nameGocreate procedure pro_name vempno int,v_name varchar(10)output,v_sal decimal(10,2)out as be
12、ginbegin try select v_name=ename,v_sal=sal from emp where empno=vempnoend try begin catchprint 错误号:+cast(error as varchar(10)print 错误内容:+error_message()end catch end-使用存储过程declare v_name varchar(10),v_sal decimal(10,2)exec pro_name 7369,v_name output,v_sal outputif v_sal2500 print 工资超过2500 else prin
13、t 工资少于2500go,2.6 存储过程的执行过程和重编译,存储过程在第 1 次执行时,要经过语法分析、解析、编译和执行共 4 个阶段,当添加了新的索引或更新了某些列数值之后,存储过程将不自动执行优化,可以强制在下次启动服务器前重编译该存储过程,以更新原有的执行计划。可以有三种方式实现:-1使用sp_recompile系统存储过程exec sp_recompile hh-2创建存储过程时增加with recompile选项ALTER procedure dbo.hh with recompileasbeginselect count(*)countfrom aaend-3 执行重新编译exe
14、c hh with recompile,2.7 加密存储过程,-使用with encryption语句对存储过程进行加密ALTER procedure dbo.hh with recompile,encryptionasbeginselect count(*)countfrom aaend,2.8 使用扩展存储过程,使用外围配置器配置,如下图:,敲入 exec xp_cmdshell dir c:“结果是列出c盘的具体内容相干的还有几个都是以xp_开头,具体可以查询msdn文档。-比如使用xp_fileexist判断文件是否存在use masterdeclare ret intexec xp_
15、fileexist e:tempweb.config,ret outputprint ret,三、用户自定义函数,用户自定义函数是接受参数、执行操作(例如复杂计算)并将操作结果以值的形式返回的子程序。返回值可以是单个标量值或结果集。SQL Server 2005支持3种类型的Transact-SQL用户自定义函数:标量函数、内嵌表值函数和多语句表值函数。在SQL Server中使用用户自定义函数有以下优点:允许模块化程序设计。执行速度更快。减少网络流量。,3.1 创建用户自定义函数,(1)标量函数标量型函数返回一个确定类型的标量值其返回值类型为除TEXT、NTEXT、IMAGE、CURSOR、
16、TIMESTAMP、table 外的其它数据类型。函数体语句定义在BEGIN-END语句内,其中包含了可以返回值的Transact-SQL 命令创建标量函数的语法如下:CREATE FUNCTION schema_name.function_name(parameter_name AS type_schema_name.parameter_data_type=default,.n)RETURNS return_data_type WITH,.n AS BEGIN function_body RETURN scalar_expression END,其中各参数的含义如下。schema_name
17、用户自定义函数所属的架构的名称。function_name 用户自定义函数的名称。parameter_name 用户自定义函数的参数。type_schema_name.parameter_data_type 参数的数据类型及其所属的架构,前者为可选项。=default 参数的默认值。return_data_type 用户自定义标量函数的返回值。function_body 函数体,指定一系列定义函数值的Transact-SQL语句。scalar_expression 指定标量函数返回的标量值。指定函数将具有以下一个或多个选项,共有两个:ENCRYPTION 指示数据库引擎对包含CREATE FU
18、NCTION语句文本的目录视图列进行加密。SCHEMABINDING 指定将函数绑定到其引用的数据库对象。,创建和使用标量函数-创建函数if exists(select name from sysobjects where name=get_salary_by_deptno)drop function get_salary_by_deptnogocreate function get_salary_by_deptno(v_dept_no int)Returns intasbegindeclare v_sum intselect v_sum=sum(sal)from emp where dept
19、no=v_dept_noif error0 beginreturn-1-其中返回-1表示函数出错了 endreturn v_sumend-使用函数print dbo.get_salary_by_deptno(10),(2)内嵌表值函数内联表值型函数以表的形式返回一个返回值,即它返回的是一个表内联表值型函数没有由BEGIN-END 语句括起来的函数体。其返回的表由一个位于RETURN 子句中的SELECT 命令段从数据库中筛选出来。内联表值型函数功能相当于一个参数化的视图。创建内嵌表值函数的语法如下:CREATE FUNCTION schema_name.function_name(parame
20、ter_name AS type_schema_name.parameter_data_type=default,.n)RETURNS TABLE WITH,.n AS RETURN(select_stmt),其中各参数的含义如下。schema_name、function_name、parameter_name、type_schema_name.parameter_data_type、=default、的含义与标量函数中的各参数相同。TABLE 指定表值函数的返回值为表。select_stmt 定义内嵌表值函数的返回值的单个SELECT语句。,使用内嵌表值函数:drop function f_
21、get_empgoCREATE FUNCTION f_get_emp()RETURNS tableasRETURN(select*from emp)注意:返回 table 数据类型的用户定义函数实际上是视图,可以对返回的数据直接更新,并影响基表。,(3)多语句表值函数多声明表值型函数可以看作标量型和内联表值型函数的结合体。它的返回值是一个表,但它和标量型函数一样有一个用BEGIN-END 语句括起来的函数体,返回值的表中的数据是由函数体中的语句插入的。由此可见,它可以进行多次查询,对数据进行多次筛选与合并,弥补了内联表值型函数的不足。创建多语句表值函数的语法如下:CREATE FUNCTION
22、 schema_name.function_name(parameter_name AS type_schema_name.parameter_data_type=default,.n)RETURNS return_variable TABLE WITH,.n AS BEGIN function_body RETURNEND,其中各参数的含义如下。schema_name、function_name、parameter_name、type_schema_name.parameter_data_type、=default、的含义与标量函数中的各参数相同。TABLE指定表值函数的返回值为表。在多语句
23、表值函数中,return_variable是TABLE变量,用于存储和汇总应作为函数值返回的行。定义表数据类型。表声明包含列定义和列约束(或表约束)。function_body函数体,指定一系列定义函数值的Transact-SQL语句。,使用多语句表值函数:drop function f_get_empgoCREATE FUNCTION f_get_emp()RETURNS abc table(empno int)asbegininsert into abc select empno from empreturnendselect*from dbo.f_get_emp(),3.2 修改删除用户
24、自定义函数,使用ALTER FUNCTION语句可以修改用户自定义函数的定义,ALTER FUNCTION语句的语法及参数与CREATE FUNCTION的语法及参数类似。使用DROP FUNCTION语句可以从当前数据库中删除一个或多个用户自定义函数。,3.3 自定义函数与存储过程的区别,存储过程与函数主要区别于返回值方面:(1)存储过程可以使用output参数返回多个值,而函数只可以返回一个值,不可以使用output参数(2)关于返回结果集方面的区别:存储过程中虽然没有return语句,但是也可以返回结果集。比如:create procedure sp1as beginselect nam
25、e,fid_fk from table_1print 111select testname,fid from table_2end这个结果,可以被被使用:insert into table_3(name,fid_fk)exec sp1,对于自定义函数,它必须指定定义为返回值为table类型的数据v,并且在代码中显式的向该table v中insert;或者,只是制定返回值为table类型,不指定return 的对象变量,直接return 该表。即:create function fn1()returns tableasreturn select fid,testname from table_2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 视图 存储 过程 函数 游标 触发器
链接地址:https://www.31ppt.com/p-2913223.html