第7章存储过程、触发器和程序包 在很多时候,都需要保存PL/SQL程序块,以便 随后可以重新使用。这也意味着,程序块需要一个名 称,这样需才可以调用或者引用它。命名的PL/SQL 程序块可被独立编译并存储在数据库中,任何与数据 库相连接的应用程序都可以访问这些存储的PL/SQL 清率电脑学堂 程序块。Oracle提供了四种类型的可存储的程序:过 程、函数、 触发器和程序包
1 第7章 存储过程、触发器和程序包 在很多时候,都需要保存PL/SQL程序块,以便 随后可以重新使用。这也意味着,程序块需要一个名 称,这样需才可以调用或者引用它。命名的PL/SQL 程序块可被独立编译并存储在数据库中,任何与数据 库相连接的应用程序都可以访问这些存储的PL/SQL 程序块。Oracle提供了四种类型的可存储的程序:过 程、函数、触发器和程序包
本章知识要点: 00-0007000771 创建Oracle存储过程 调用存储过程 理解存储过程中各种形式的参数 为过程添加局部变量和子过程 PL/SQL程序中的函数应用 触发器的应用 语句级触发器的特点 行级触发器的特点 清率电脑学堂 INSTEAD OF触发器的特点 系统级触发器的特点 用户事件触发器的特点 程序包规范和主体 程序包中的私有过程和公有过程 程序包中的初始化代码 理解程序包中函数或过程的重载 了解Oracle提供了常见系统程序句
2 本章知识要点: • 创建Oracle存储过程 • 调用存储过程 • 理解存储过程中各种形式的参数 • 为过程添加局部变量和子过程 • PL/SQL程序中的函数应用 • 触发器的应用 • 语句级触发器的特点 • 行级触发器的特点 • INSTEAD OF触发器的特点 • 系统级触发器的特点 • 用户事件触发器的特点 • 程序包规范和主体 • 程序包中的私有过程和公有过程 • 程序包中的初始化代码 • 理解程序包中函数或过程的重载 • 了解Oracle提供了常见系统程序句
7.1存储过程 存储过程是一种命名的PL/SQL程序块,它可以接 受零个或多个参数作为输入、输出,或者既作输入又 作输出的参数。过程被存储在数据库中,并且存储过 程没有返回值,存储过程不能由SQL语句直接使用, 只能通过EXECUT命令或PL凵SQL程序块内部调用。由 清率电脑学堂 于存储过程是已经编译好的代码,所以在调用的时候 不必再次进行编译,从而提高了程序的运行效率
3 7.1 存储过程 • 存储过程是一种命名的PL/SQL程序块,它可以接 受零个或多个参数作为输入、输出,或者既作输入又 作输出的参数。过程被存储在数据库中,并且存储过 程没有返回值,存储过程不能由SQL语句直接使用, 只能通过EXECUT命令或PL/SQL程序块内部调用。由 于存储过程是已经编译好的代码,所以在调用的时候 不必再次进行编译,从而提高了程序的运行效率
7.1.1创建存储过程 创建存储过程之前,先来看一下创建存储过程的 语法结构。定义存储过程的语法如下: create procedure procedure name 清率电脑学堂 [(parameter[,parameter,...])]is [local declarations] begin execute statements [exception exception handlers end [procedure name]
7.1.1 创建存储过程 • 创建存储过程之前,先来看一下创建存储过程的 语法结构。定义存储过程的语法如下: 4 create procedure procedure_name [(parameter[,parameter,...])] is [local declarations] begin execute statements [exception exception handlers ] end [procedure _name]
7.1.3默认值 存储过程的参数也可以有默认值,这样当调用该 过程时,如果未向参数传入值,则该参数将使用定义 的默认值。例如,下面修改了ADD EMPLOYEE存储 过程,为其中的参数提供了默认值: 清率电脑学堂 SQL>create or replace procedure add_employee( id param in number. 3 name param in varchar2, job_param in varchar2 default 'SALESMAN. 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_paramname_paramjob_param,hire_paramsalary_param) 10 end add_employee; 11/ 过程已创建
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 / 过程已创建
7.1.4过程中的事务处理 当在SQL*Pus中进行操作时,用户可以使用 COMMIT语句将在事务中的所有操作“保存”到数据库 中。如果用户需要撤销所有的操作,则可以使用 清率电脑 子 ROLLBACK语句回退事务中未提交的操作,使数据库返 回到事务处理开始前的状态。在PL/SQL过程中,不仅可 以包括插入和更新这类的DML操作,还可以包括事务处 学堂 二二工二二工 理语句COMMIT和ROLLBACK
6 7.1.4 过程中的事务处理 • 当在SQL*Plus中进行操作时,用户可以使用 COMMIT语句将在事务中的所有操作“保存”到数据库 中。如果用户需要撤销所有的操作,则可以使用 ROLLBACK语句回退事务中未提交的操作,使数据库返 回到事务处理开始前的状态。在PL/SQL过程中,不仅可 以包括插入和更新这类的DML操作,还可以包括事务处 理语句COMMIT和ROLLBACK
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]
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]
7.3触发器 触发器是关系数据库系统提供的一项技术,触发器 清 类似过程和函数,它们都包括声明部分,执行逻辑处理 部分和异常处理部分,并且都被存储在数据库中。 率电脑学堂
7.3 触发器 • 触发器是关系数据库系统提供的一项技术,触发器 类似过程和函数,它们都包括声明部分,执行逻辑处理 部分和异常处理部分,并且都被存储在数据库中。 8
7.3.1触发器的概述 触发器是与一个表或数据库事件联系在一起的, 当特定事件出现时将自动执行触发器的代码块。触发 器与过程的区别在于:过程是由用户或应用程序显式 调用的,而触发器是不能被直接调用的。 清率电脑学堂
7.3.1 触发器的概述 • 触发器是与一个表或数据库事件联系在一起的, 当特定事件出现时将自动执行触发器的代码块。触发 器与过程的区别在于:过程是由用户或应用程序显式 调用的,而触发器是不能被直接调用的。 9
7.3.2语句级触发器 如果在创建触发器时未使用FOR EACH ROW子句 则创建的触发器为语句级触发器。语句级触发器在被 触发后只执行一次,而不管这一操作会影响到数据库中 多少行记录。 清率电脑学堂
10 7.3.2 语句级触发器 • 如果在创建触发器时未使用FOR EACH ROW子句 ,则创建的触发器为语句级触发器。语句级触发器在被 触发后只执行一次,而不管这一操作会影响到数据库中 多少行记录