过程函数包和触发器精选文档.ppt
《过程函数包和触发器精选文档.ppt》由会员分享,可在线阅读,更多相关《过程函数包和触发器精选文档.ppt(85页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、过程函数包和触发器本讲稿第一页,共八十五页理解子程序(过程、函数)及包的概念理解子程序(过程、函数)及包的概念 掌握掌握如何创建、执行和删除过程如何创建、执行和删除过程、函数及包的方法、函数及包的方法 了解形参和实参的区别以及不同参数模式的特征了解形参和实参的区别以及不同参数模式的特征灵活使用过程、函数及包书写灵活使用过程、函数及包书写PL/SQLPL/SQL程序程序掌握创建和测试掌握创建和测试DMLDML触发器、触发器、instead-ofinstead-of数据库触发数据库触发器以及系统触发器器以及系统触发器了解数据库触发器的使用时机和限制了解数据库触发器的使用时机和限制本章要点本章要点本
2、讲稿第二页,共八十五页掌握存储子程序与数据字典的交互方式及如何从掌握存储子程序与数据字典的交互方式及如何从SQLSQL语句中调用存储子程序语句中调用存储子程序了解存储子程序和局部子程序的区别了解存储子程序和局部子程序的区别掌握存储子程序的特性。掌握存储子程序的特性。本章子要点本章子要点本讲稿第三页,共八十五页子程序位置子程序位置l子程序和包可以存储在数据字典中(子程序是用命令子程序和包可以存储在数据字典中(子程序是用命令CREATE OR REPLACE创建)创建)l可以从其他可以从其他PL/SQL语句块中调用已创建的子程序。语句块中调用已创建的子程序。l子程序可以在语句块的声明段定义,以这种
3、方式子程序可以在语句块的声明段定义,以这种方式定义的子程序叫做定义的子程序叫做局部子程序局部子程序。l包则必须存储在数据字典中,而不能是局部的。包则必须存储在数据字典中,而不能是局部的。本讲稿第四页,共八十五页存储子程序和数据字典存储子程序和数据字典 l当使用命令当使用命令CREATE OR REPLACE创建创建子程序时,该子程序就被存储在数据字子程序时,该子程序就被存储在数据字典中。典中。l子程序的信息可以通过各种数据字典视子程序的信息可以通过各种数据字典视图来访问。图来访问。本讲稿第五页,共八十五页局部子程序局部子程序l局部子程序局部子程序:是一个在是一个在PL/SQL语句块的声语句块的
4、声明段中声明的子程序。明段中声明的子程序。l子函数子函数只在其声明的语句块中可见,其作只在其声明的语句块中可见,其作用域从声明点开始到该语句块结束为止。用域从声明点开始到该语句块结束为止。其他语句块不能调用该函数,因为该函数其他语句块不能调用该函数,因为该函数对其他语句块来说是不可见的。对其他语句块来说是不可见的。本讲稿第六页,共八十五页局部子程序(续)局部子程序(续)l局部子程序也可以声明为存储子程序声明局部子程序也可以声明为存储子程序声明段的一部分段的一部分l局部子程序的位置:任何局部子程序都必局部子程序的位置:任何局部子程序都必须在声明段的最后进行声明须在声明段的最后进行声明l预先声明预
5、先声明:局部:局部PL/SQL子程序的名称是子程序的名称是标识符,必须在被引用前声明。标识符,必须在被引用前声明。l局部子程序也可以重载局部子程序也可以重载本讲稿第七页,共八十五页存储子程序和局部子程序的比较存储子程序和局部子程序的比较存储子程序局部子程序该类子程序以编译后生成的伪代码形式p-code存储在数据库中。当调用该类子程序时,不需进行编译即可运行局部子程序被编译为包含它的语句块的一部分。如果其所在语句块是匿名块并需要多次运行时,则该子程序就必须每次进行编译存储子程序可以从对该子程序具有EXECUTE特权的用户所提交的任何语句块中调用局部子程序只能从包含子程序的语句块中调用由于存储子程
6、序与调用块的相互隔离,调用块具有代码少,易于理解的特点。除此之外,子程序和调用块还可以分开维护局部子程序和调用块同处于一个块内,所以容易引起混淆。如果修改了调用块的话,则该块调用的子程序作为所属块的一部分也要重新编译可以使用DBMS_SHARED_POOL.KEEP包过程来把编译后p-code代码存储在共享池中。这种方式可以改善程序性能局部子程序自身不能存储在共享池中独立的存储子程序不能进行重载,但同一包内的子程序可以重载同一块中的局部子程序可以重载本讲稿第八页,共八十五页存储子程序和包的注意事项存储子程序和包的注意事项优势:优势:l可以由多个数据库用户共享可以由多个数据库用户共享隐含影响:隐
7、含影响:l存储子程序间的依赖性存储子程序间的依赖性l包状态的处理方法包状态的处理方法l运行存储子程序运行存储子程序l包所需要的特权包所需要的特权本讲稿第九页,共八十五页子程序的依赖性子程序的依赖性 l依赖:数据字典记录了存储过程或函数所引用的所有依赖:数据字典记录了存储过程或函数所引用的所有Oracle对象。该过程或函数就依赖于这些存储的对对象。该过程或函数就依赖于这些存储的对象。象。l自动重编译自动重编译:如果一个依赖对象失效,如果一个依赖对象失效,PL/SQL引擎将在引擎将在该对象再次被调用时对其重新进行编译。该对象再次被调用时对其重新进行编译。l包的依赖性:包体的变化不会导致修改包头。因
8、此,其包的依赖性:包体的变化不会导致修改包头。因此,其他依赖于该包头的对象也不需要进行重新编译。如果该他依赖于该包头的对象也不需要进行重新编译。如果该包头有变化,则会使包体自动失效,这是因为该包头有变化,则会使包体自动失效,这是因为该包体包体依赖于包头依赖于包头。l如何确定无效如何确定无效:通过数据字典在不断地跟踪对象间依赖通过数据字典在不断地跟踪对象间依赖性性本讲稿第十页,共八十五页包运行时状态包运行时状态l当第一次实例化一个包时,将从磁盘中读入该包的当第一次实例化一个包时,将从磁盘中读入该包的伪代码并将其放入系统全局工作区伪代码并将其放入系统全局工作区SGA的共享池中。的共享池中。l包的运
9、行时状态,即打包的变量和游标,则存放在用包的运行时状态,即打包的变量和游标,则存放在用户全局区(户全局区(UGA)的会话存储区中。这就保证了每个)的会话存储区中。这就保证了每个会话都将有其运行时状态的副本。会话都将有其运行时状态的副本。l可串行复用包和非串行复用包:可串行复用包和非串行复用包:PL/SQL 2.3版及更高版版及更高版本允许程序员对包做可串行复用标志。本允许程序员对包做可串行复用标志。本讲稿第十一页,共八十五页包运行时状态包运行时状态可串行复用包非串行复用包运行时状态保存在SGA中,每次数据库调用后都将该运行时状态释放运行时状态保存在UGA中,其生存期与数据库会话相同所用的最大内
10、存与同时使用该包的用户数成正比所用的最大内存与当前登录的用户数成正比本讲稿第十二页,共八十五页特权和存储子程序特权和存储子程序 l存储子程序和包都是数据库字典中的对存储子程序和包都是数据库字典中的对象,因而,它们属于特殊的数据库用户象,因而,它们属于特殊的数据库用户或模式。如果用户被授予了正确的特权,或模式。如果用户被授予了正确的特权,则它们就可以访问这些对象。则它们就可以访问这些对象。l当创建一个存储对象时,考虑到子程序当创建一个存储对象时,考虑到子程序内部的访问可用性,特权和角色也开始内部的访问可用性,特权和角色也开始起作用。起作用。本讲稿第十三页,共八十五页EXECUTE特权特权 l为了
11、能够对表进行访问,必须使用为了能够对表进行访问,必须使用SELECT,INSERT,UPDATE和和DELETE对象特权。对象特权。GRANT语句把这些语句把这些特权赋予数据库用户或角色。对于存储特权赋予数据库用户或角色。对于存储子程序和包来说,相关的特权是子程序和包来说,相关的特权是EXECUTE。本讲稿第十四页,共八十五页本讲稿第十五页,共八十五页本讲稿第十六页,共八十五页存储子程序和角色存储子程序和角色 l子程序使用显式地(而不是通过角色)子程序使用显式地(而不是通过角色)授权其所有者的特权而执行。授权其所有者的特权而执行。l为了使通过角色授权的特权作用在存储为了使通过角色授权的特权作用
12、在存储子程序和触发器内被使用,每次运行过子程序和触发器内被使用,每次运行过程时,必须对该特权进行检查。程时,必须对该特权进行检查。本讲稿第十七页,共八十五页调用者的权限与定义者的权限调用者的权限与定义者的权限 lOracle提供了不同的外部引用解决方案。在调用者提供了不同的外部引用解决方案。在调用者的权限子程序中,外部引用是通过调用者而不是的权限子程序中,外部引用是通过调用者而不是所有者的特权设置而执行的。调用者的权限程序所有者的特权设置而执行的。调用者的权限程序是通过使用是通过使用AUTHID子句而创建,该语句只适用于独子句而创建,该语句只适用于独立子程序、包说明和对象类型说明。立子程序、包
13、说明和对象类型说明。l在包内部或对象类型中的独立子程序必须都是调用者在包内部或对象类型中的独立子程序必须都是调用者子程序或都是定义者子程序,而不能混合。子程序或都是定义者子程序,而不能混合。本讲稿第十八页,共八十五页AUTHIDAUTHID的语法如下:的语法如下:的语法如下:的语法如下:CREATE OR REPLACE FUNCTION function_name parameter_list RETURN return_type AUTHID CURRENT_USER|DEFINER IS|AS function_body;CREATE OR REPLACE PROCEDURE proce
14、dure_name parameter_list AUTHID CURRENT_USER|DEFINER IS|AS function_body;CREATE OR REPLACE PACKAGE package_spec_name AUTHID CURRENT_USER|DEFINER IS|AS package_spec;CREATE OR REPLACE TYPE type_name AUTHID CURRENT_USER|DEFINER IS|AS OBJECT type_spec;本讲稿第十九页,共八十五页默认参数默认参数l从过程化语句中调用一个函数时,如果该函从过程化语句中调用一个
15、函数时,如果该函数有形参的话,可以使用其缺省值。然而,数有形参的话,可以使用其缺省值。然而,如果从如果从SQL语句调用函数时,必须指定所有语句调用函数时,必须指定所有参数。参数。l必须使用位置对应法(必须使用位置对应法(Positinal Notation),而不能使用名称对应法(而不能使用名称对应法(Name Notation)。)。本讲稿第二十页,共八十五页从从Oracle中从中从SQL语句调用函数语句调用函数l从从Oracle起,从起,从DML语句中调用的函数语句中调用的函数既不可以从正在被该既不可以从正在被该DML语句修改的数语句修改的数据库表读取数据,也不能对其进行修改,据库表读取数
16、据,也不能对其进行修改,但该函数可以更新其他表。但该函数可以更新其他表。本讲稿第二十一页,共八十五页包的辅助功能包的辅助功能 l共享池锁定共享池锁定l包体长度的限制包体长度的限制 l优化参数优化参数本讲稿第二十二页,共八十五页共享池锁定共享池锁定 lDBMS_SHARED_POOL包允许程序员把一个对象包允许程序员把一个对象锁定在共享池中。锁定在共享池中。l当该对象被锁定后,除非由程序申请对其清除,当该对象被锁定后,除非由程序申请对其清除,否则无论共享池有多满,也不管是否有程序访问否则无论共享池有多满,也不管是否有程序访问该对象,该对象将常驻在共享池中。该对象,该对象将常驻在共享池中。l这种处
17、理方法有利于提高程序的运行效率,因为从系这种处理方法有利于提高程序的运行效率,因为从系统的磁盘重新装入对象要进行大量读写操作。锁定对统的磁盘重新装入对象要进行大量读写操作。锁定对象还有助于最大限度地减少共享池的碎片。象还有助于最大限度地减少共享池的碎片。本讲稿第二十三页,共八十五页包体长度的限制包体长度的限制 l编译器对包体长度的限制如下编译器对包体长度的限制如下:lDiana树中的节点数。在树中的节点数。在Oracle8i之前的版本中,之前的版本中,Diana节点节点的最大数目是的最大数目是32K,Oracle8i以上版本将包体和类型体的限制以上版本将包体和类型体的限制扩充到了扩充到了64兆
18、字节的容量。兆字节的容量。l编译器生成的临时中间变量的容量最多编译器生成的临时中间变量的容量最多21K字节。字节。l入口点的数量。一个包体最多可以有入口点的数量。一个包体最多可以有32K个入口点,入口点可个入口点,入口点可以是过程或函数。以是过程或函数。l字符串的数量。字符串的数量。PL/SQL对字符串的限制单位是对字符串的限制单位是232。本讲稿第二十四页,共八十五页优化参数优化参数 l使用使用DETERMINISTIC和和PARALLEL_ENABLE关键字,关键字,PL/SQL编译优化器将会对调用编译优化器将会对调用PL/SQL函数进行优化。函数进行优化。l该关键字要放在函数的返回类型和
19、该关键字要放在函数的返回类型和IS或或AS子句之间子句之间。CREATE OR REPLACE FUNCTION function_nameCREATE OR REPLACE FUNCTION function_name parameter_list parameter_listRETURN return_typeRETURN return_typeDETERMINISTICDETERMINISTICPARALLEL_ENABLEPARALLEL_ENABLEIS|ASIS|ASfunction_body;function_body;本讲稿第二十五页,共八十五页小结小结1.通过访问各种数据库字
20、典视图来查询子程序的信息。通过访问各种数据库字典视图来查询子程序的信息。user_objects视视图包含了当前用户拥有的所有对象的信息。图包含了当前用户拥有的所有对象的信息。user_source视图包含视图包含对象的源程序代码。对象的源程序代码。user_errors视图则包含编译错误的信息。视图则包含编译错误的信息。2.预先声明可以解决函数之间相互调用的问题。预先声明可以解决函数之间相互调用的问题。3.子程序引用其他数据库对象时,该子程序依赖于那个对象。如果修改子程序引用其他数据库对象时,该子程序依赖于那个对象。如果修改了被引用对象,那么依赖对象的状态将更改为无效,指出需要重新编了被引用
21、对象,那么依赖对象的状态将更改为无效,指出需要重新编译。译。4.在在PL/SQL中使用的函数可以使用额外的限制,这被称为纯度等中使用的函数可以使用额外的限制,这被称为纯度等级。级。5.共享池是在子程序运行时包含已编译子程序伪代码及其他代码的共享池是在子程序运行时包含已编译子程序伪代码及其他代码的SGA的一部分。的一部分。KEEP过程用来在共享池中锁定对象。过程用来在共享池中锁定对象。UNKEEP过程实现过程实现从共享池中删除锁定对象。从共享池中删除锁定对象。SIZES过程用来把共享池的内容输出到屏过程用来把共享池的内容输出到屏幕。幕。6.PL/SQL编译优化器使用编译优化器使用DETERMIN
22、ISTIC和和PARALLEL_ENABLE关键字对调用关键字对调用PL/SQL函数进行优化。函数进行优化。本讲稿第二十六页,共八十五页 数据库开发技术数据库开发技术第第14章(下)章(下)数据库触发器数据库触发器福建工程学院福建工程学院本讲稿第二十七页,共八十五页 本章要点本章要点l理解数据库触发器、变异表和约束表的概念及数据库触发器的语法l掌握如何在SQL*PLUS中创建和测试DML触发器、instead-of数据库触发器以及系统触发器l了解数据库触发器的使用时机和限制。本讲稿第二十八页,共八十五页触发器的概念触发器的概念作为数据库对象的触发器是一个与表相关作为数据库对象的触发器是一个与表
23、相关联的被存储的联的被存储的PL/SQL程序。每当一个特定程序。每当一个特定的数据操作语句在指定的表上发生时,就的数据操作语句在指定的表上发生时,就会引发触发器的执行。会引发触发器的执行。与存储子程序的调用方式不同,触发与存储子程序的调用方式不同,触发器的执行是采用触发机制器的执行是采用触发机制本讲稿第二十九页,共八十五页触发器的定义和使用触发器的定义和使用触发器是当特定事件出现时自动执行的存储过程触发器是当特定事件出现时自动执行的存储过程特定事件可以是执行更新的特定事件可以是执行更新的DML语句和语句和DDL语句语句触发器不能被显式调用触发器不能被显式调用触发器的功能:触发器的功能:自动生成
24、数据自动生成数据自定义复杂的安全权限自定义复杂的安全权限提供审计和日志记录提供审计和日志记录启用复杂的业务逻辑启用复杂的业务逻辑本讲稿第三十页,共八十五页触发器的类型触发器的类型 触发器主要有三种类型:触发器主要有三种类型:lDMLlINSTEAD-OF触发器触发器l系统触发器。系统触发器。触发器的应用,主要用于:触发器的应用,主要用于:l维护那些通过创建表时的声明约束无法实现的复杂的完整性约束。维护那些通过创建表时的声明约束无法实现的复杂的完整性约束。l通过记录已进行的改变以及是谁进行了该项改变来检查一个通过记录已进行的改变以及是谁进行了该项改变来检查一个表中的信息。表中的信息。l当一个表发
25、生改变时,自动向其他程序发送需要采取行动的信号。当一个表发生改变时,自动向其他程序发送需要采取行动的信号。l在一个发布在一个发布-预订环境中发布有关各种事件的信息。预订环境中发布有关各种事件的信息。本讲稿第三十一页,共八十五页DML触发器触发器 lDML触发器可以由触发器可以由DML语句激发语句激发l由由DML语句的类型决定语句的类型决定DML触发器的类触发器的类型。型。lDML触发器可以在触发器可以在DML语句操作之前或语句操作之前或之后激发。之后激发。lDML触发器也可以在行或语句操作上激触发器也可以在行或语句操作上激发发。本讲稿第三十二页,共八十五页INSTEAD-OF触发器触发器 lI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 过程 函数 触发器 精选 文档
限制150内