资源预览内容
第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
第9页 / 共17页
第10页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1第7章 存储过程、触发器和程序包 在很多时候,都需要保存PL/SQL程序块,以便随后可以重新使用。这也意味着,程序块需要一个名称,这样需才可以调用或者引用它。命名的PL/SQL程序块可被独立编译并存储在数据库中,任何与数据库相连接的应用程序都可以访问这些存储的PL/SQL程序块。Oracle提供了四种类型的可存储的程序:过程、函数、触发器和程序包。2本章知识要点:创建Oracle存储过程调用存储过程理解存储过程中各种形式的参数为过程添加局部变量和子过程PL/SQL程序中的函数应用触发器的应用语句级触发器的特点行级触发器的特点INSTEAD OF触发器的特点系统级触发器的特点用户事件触发器的特点程序包规范和主体程序包中的私有过程和公有过程程序包中的初始化代码理解程序包中函数或过程的重载了解Oracle提供了常见系统程序句37.1 存储过程 存储过程是一种命名的PL/SQL程序块,它可以接受零个或多个参数作为输入、输出,或者既作输入又作输出的参数。过程被存储在数据库中,并且存储过程没有返回值,存储过程不能由SQL语句直接使用,只能通过EXECUT命令或PL/SQL程序块内部调用。由于存储过程是已经编译好的代码,所以在调用的时候不必再次进行编译,从而提高了程序的运行效率。7.1.1 创建存储过程 创建存储过程之前,先来看一下创建存储过程的语法结构。定义存储过程的语法如下:4create procedure procedure_name (parameter,parameter,.) islocal declarationsbegin execute statementsexception exception handlers end procedure _name7.1.3 默认值 存储过程的参数也可以有默认值,这样当调用该过程时,如果未向参数传入值,则该参数将使用定义的默认值。例如,下面修改了ADD_EMPLOYEE存储过程,为其中的参数提供了默认值:5SQL create or replace procedure add_employee( 2 id_param in number, 3 name_param in varchar2, 4 job_param in varchar2 default SALESMAN, 5 hire_param in date default sysdate, 6 salary_param in number default 1000) is 7 begin 8 insert into scott.emp(empno,ename,job,hiredate,sal) 9 values(id_param,name_param,job_param,hire_param,salary_param); 10 end add_employee; 11 /过程已创建。67.1.4 过程中的事务处理 当在SQL*Plus中进行操作时,用户可以使用COMMIT语句将在事务中的所有操作“保存”到数据库中。如果用户需要撤销所有的操作,则可以使用ROLLBACK语句回退事务中未提交的操作,使数据库返回到事务处理开始前的状态。在PL/SQL过程中,不仅可以包括插入和更新这类的DML操作,还可以包括事务处理语句COMMIT和ROLLBACK。77.2 函数 函数与过程非常类似,它也是一种存储在数据库中的命名程序块,并且函数也可以接受零个或多个输入参数。函数与过程之间的主要区别在于,函数必须有返回值,并且可以作为一个表达式的一部分,函数不能作为一个完整的语句使用。函数返回值的数据类型在创建函数时定义,定义函数的基本语法如下:create or replace function function_name (parameter ,parameter) returne data_type is local declarationsbegin execute statementsexceptionexception handlersend function_name7.3 触发器 触发器是关系数据库系统提供的一项技术,触发器类似过程和函数,它们都包括声明部分,执行逻辑处理部分和异常处理部分,并且都被存储在数据库中。87.3.1 触发器的概述 触发器是与一个表或数据库事件联系在一起的,当特定事件出现时将自动执行触发器的代码块。触发器与过程的区别在于:过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。9107.3.2 语句级触发器 如果在创建触发器时未使用FOR EACH ROW子句,则创建的触发器为语句级触发器。语句级触发器在被触发后只执行一次,而不管这一操作会影响到数据库中多少行记录。117.3.3 行级触发器 在创建触发器时,如果使用了FOR EACH ROW选项,则创建的该触发器为行级触发器。对于行级触发器而言,当一个DML语句操作影响到数据库中的多行数据时,行级触发器会针对于每一行执行一次。7.3.4 INSTEAD OF 触发器 INSTEAD OF 触发器也称替代触发器,定义INSTEAD OF触发器后,用户对表的DML操作将不再被执行,而是执行触发器主体中的操作。通常情况下,INSTEAD OF触发器是定义在视图上的,而不是在表上定义的触发器,它是用来替换所使用实际语句的触发器。127.3.5 用户事件触发器 用户事件触发器是建立在模式级的操作上的触发器。激活该类型触发器的用户事件包括:CREATE、ALTER、DROP、ANALYZE、ASSOCIATE STATISTICS、DISASSOCIATE 、STATISTICS、COMMENT、GRANT、REVOKE、RENAME、TRUNCATE、LOGOFF、SUSPEND和LOGON。137.4 程序包 程序包其实就是被组合在一起的相关对象的集合,当程序包中任何函数或存储过程被调用时,程序包就被加载入到内存中,这样程序包中的任何函数或存储过程的子程序访问速度将大大加快。例如,在PL/SQL程序中,为了输出运行结果,在程序的代码中使用了DBMS_OUTPT.PUT_LINE语句。事实上,这是调用程序包DBMS_OUTPUT中的PUT_LINE过程。DBMS_OUTPUT程序包的主要功能就是在PL/SQL程序中的输入和输出。147.4.1 程序包规范 对于程序包,规范就像一个说明书,它说明了在程序包中哪些过程或函数可以使用,如何使用。程序包规范必需的,并且必须在程序包主体之前创建。 创建程序包规范的语法形式如下:15create or replace package package_name is public_variable_declarations public_type_declarations public_exception_declarations public_cursor_declarations function_declarations procedure_specificationsend package_name 167.4.2 主体 程序包主体包含了在规范中声明的过程和函数的实现代码,程序包主体的名称必须与规范的名称相同,这个相同的名称将规范与主体结合在一起组成程序包。另外,程序包主体中定义的过程和函数的名称、参数和返回值等必须与规范中声明的完全区配。177.4.3 重载 PL/SQL允许两个或多个包级子程序拥有相同的名称,这就是PL/SQL程序的重载。在通常情况下,在程序包中的过程和函数必须具有惟一的名称,用于惟一表示一个过程和函数。PL/SQL允许重载,也就是在程序包中的过程和函数可以具有相同的名称,但只需它们的特性有所区别。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号