Download presentation
Presentation is loading. Please wait.
Published byAndrew Rudolph Greene Modified over 9 years ago
1
1 第 7 章 存储过程、触发器和程序包 在很多时候,都需要保存 PL/SQL 程序块,以便 随后可以重新使用。这也意味着,程序块需要一个名 称,这样需才可以调用或者引用它。命名的 PL/SQL 程序块可被独立编译并存储在数据库中,任何与数据 库相连接的应用程序都可以访问这些存储的 PL/SQL 程序块。 Oracle 提供了四种类型的可存储的程序:过 程、函数、触发器和程序包。
2
2 本章知识要点: 创建 Oracle 存储过程 调用存储过程 理解存储过程中各种形式的参数 为过程添加局部变量和子过程 PL/SQL 程序中的函数应用 触发器的应用 语句级触发器的特点 行级触发器的特点 INSTEAD OF 触发器的特点 系统级触发器的特点 用户事件触发器的特点 程序包规范和主体 程序包中的私有过程和公有过程 程序包中的初始化代码 理解程序包中函数或过程的重载 了解 Oracle 提供了常见系统程序句
3
3 7.1 存储过程 存储过程是一种命名的 PL/SQL 程序块,它可以接 受零个或多个参数作为输入、输出,或者既作输入又 作输出的参数。过程被存储在数据库中,并且存储过 程没有返回值,存储过程不能由 SQL 语句直接使用, 只能通过 EXECUT 命令或 PL/SQL 程序块内部调用。由 于存储过程是已经编译好的代码,所以在调用的时候 不必再次进行编译,从而提高了程序的运行效率。
4
7.1.1 创建存储过程 创建存储过程之前,先来看一下创建存储过程的 语法结构。定义存储过程的语法如下: 4 create procedure procedure_name [(parameter[,parameter,...])] is [local declarations] begin execute statements [exception exception handlers ] end [procedure _name]
5
7.1.3 默认值 存储过程的参数也可以有默认值,这样当调用该 过程时,如果未向参数传入值,则该参数将使用定义 的默认值。例如,下面修改了 ADD_EMPLOYEE 存储 过程,为其中的参数提供了默认值: 5 SQL> 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 / 过程已创建。
6
6 7.1.4 过程中的事务处理 当在 SQL*Plus 中进行操作时,用户可以使用 COMMIT 语句将在事务中的所有操作 “ 保存 ” 到数据库中。 如果用户需要撤销所有的操作,则可以使用 ROLLBACK 语句回退事务中未提交的操作,使数据库返回到事务处 理开始前的状态。在 PL/SQL 过程中,不仅可以包括插入 和更新这类的 DML 操作,还可以包括事务处理语句 COMMIT 和 ROLLBACK 。
7
7 7.2 函数 函数与过程非常类似,它也是一种存储在数据库 中的命名程序块,并且函数也可以接受零个或多个输 入参数。函数与过程之间的主要区别在于,函数必须 有返回值,并且可以作为一个表达式的一部分,函数 不能作为一个完整的语句使用。函数返回值的数据类 型在创建函数时定义,定义函数的基本语法如下: create [or replace] function function_name (parameter [,parameter]) returne data_type is [local declarations] begin execute statements [exception exception handlers] end [function_name]
8
7.3 触发器 触发器是关系数据库系统提供的一项技术,触发器 类似过程和函数,它们都包括声明部分,执行逻辑处理 部分和异常处理部分,并且都被存储在数据库中。 8
9
7.3.1 触发器的概述 触发器是与一个表或数据库事件联系在一起的, 当特定事件出现时将自动执行触发器的代码块。触发 器与过程的区别在于:过程是由用户或应用程序显式 调用的,而触发器是不能被直接调用的。 9
10
10 7.3.2 语句级触发器 如果在创建触发器时未使用 FOR EACH ROW 子句 ,则创建的触发器为语句级触发器。语句级触发器在被 触发后只执行一次,而不管这一操作会影响到数据库中 多少行记录。
11
11 7.3.3 行级触发器 在创建触发器时,如果使用了 FOR EACH ROW 选项,则创建的该触发器为行级触发器。对于行级触 发器而言,当一个 DML 语句操作影响到数据库中的多 行数据时,行级触发器会针对于每一行执行一次。
12
7.3.4 INSTEAD OF 触发器 INSTEAD OF 触发器也称替代触发器,定义 INSTEAD OF 触发器后,用户对表的 DML 操作将不再 被执行,而是执行触发器主体中的操作。通常情况下 , INSTEAD OF 触发器是定义在视图上的,而不是在 表上定义的触发器,它是用来替换所使用实际语句的 触发器。 12
13
7.3.5 用户事件触发器 用户事件触发器是建立在模式级的操作上的触发 器。激活该类型触发器的用户事件包括: CREATE 、 ALTER 、 DROP 、 ANALYZE 、 ASSOCIATE STATISTICS 、 DISASSOCIATE 、 STATISTICS 、 COMMENT 、 GRANT 、 REVOKE 、 RENAME 、 TRUNCATE 、 LOGOFF 、 SUSPEND 和 LOGON 。 13
14
7.4 程序包 程序包其实就是被组合在一起的相关对象的集合, 当程序包中任何函数或存储过程被调用时,程序包就被 加载入到内存中,这样程序包中的任何函数或存储过程 的子程序访问速度将大大加快。例如,在 PL/SQL 程序 中,为了输出运行结果,在程序的代码中使用了 DBMS_OUTPT.PUT_LINE 语句。事实上,这是调用程 序包 DBMS_OUTPUT 中的 PUT_LINE 过程。 DBMS_OUTPUT 程序包的主要功能就是在 PL/SQL 程 序中的输入和输出。 14
15
7.4.1 程序包规范 对于程序包,规范就像一个说明书,它说明了在 程序包中哪些过程或函数可以使用,如何使用。程序 包规范必需的,并且必须在程序包主体之前创建。 创建程序包规范的语法形式如下: 15 create [or replace] package package_name is [public_variable_declarations…] [public_type_declarations…] [public_exception_declarations…] [public_cursor_declarations…] [function_declarations…] [procedure_specifications…] end [package_name]
16
16 7.4.2 主体 程序包主体包含了在规范中声明的过程和函数的实 现代码,程序包主体的名称必须与规范的名称相同,这 个相同的名称将规范与主体结合在一起组成程序包。另 外,程序包主体中定义的过程和函数的名称、参数和返 回值等必须与规范中声明的完全区配。
17
17 7.4.3 重载 PL/SQL 允许两个或多个包级子程序拥有相同的 名称,这就是 PL/SQL 程序的重载。在通常情况下, 在程序包中的过程和函数必须具有惟一的名称,用于 惟一表示一个过程和函数。 PL/SQL 允许重载,也就 是在程序包中的过程和函数可以具有相同的名称,但 只需它们的特性有所区别。
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.