触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。
功能:
1 、 允许 / 限制对表的修改
2 、 自动生成派生列,比如自增字段
3 、 强制数据一致性
4 、 提供审计和日志记录
5 、 防止无效的事务处理
6 、 启用复杂的业务逻辑
开始 :
create trigger biufer_employees_department_id
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
when (new_value.department_id<>80 )
begin
:new_value.commission_pct :=0;
end;
/
触发器的组成部分:
1 、 触发器名称
2 、 触发语句
3 、 触发器限制
4 、 触发操作
1 、 触发器名称
create trigger biufer_employees_department_id
命名习惯:
biufer ( before insert update for each row )
employees 表名
department_id 列名
2 、 触发语句
比如:
表或视图上的 DML 语句; DDL 语句,数据库关闭或启动 ,startup shutdown 等等
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
说明:
( 1 )、 无论是否规定了 department_id ,对 employees 表进行 insert 的时候
( 2 )、 对 employees 表的 department_id 列进行 update 的时候
3 、 触发器限制
when (new_value.department_id<>80 )
限制不是必须的。此例表示如果列 department_id 不等于 80 的时候,触发器就会执行。其中的 new_value 是代表跟新之后的值。
4 、 触发操作
是触发器的主体
begin
:new_value.commission_pct :=0;
end;
主体很简单,就是将更新后的 commission_pct 列置为 0
触发:
insert into employees
(employee_id,last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct )
values( 12345,’Chen’,’Donny’, sysdate, 12, ‘[email protected]’,60,10000,.25);
select commission_pct from employees where employee_id=12345;
触发器不会通知用户,便改变了用户的输入值。
触发器类型:
1 、 语句触发器
2 、 行触发器
3 、 INSTEAD OF 触发器
4 、 系统条件触发器
5 、 用户事件触发器
包 :是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装。包类似于C++和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。
把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。
一个包由两个分开的部分组成:
包定义(PACKAGE):包定义部分声明包内数据类型、变量、常量、游标、子程序和异常错误处理等元素,这些元素为包的公有元素。
包主体(PACKAGE BODY):包主体则是包定义部分的具体实现,它定义了包定义部分所声明的游标和子程序,在包主体中还可以声明包的私有元素。 包定义和包主体分开编译,并作为两部分分开的对象存放在数据库字典中。
包定义的语法如下:
CREATE [OR REPLACE] PACKAGE package_name {IS | AS}
[公有数据类型定义[公有数据类型定义]…] [公有游标声明[公有游标声明]…] [公有变量、常量声明[公有变量、常量声明]…] [公有子程序声明[公有子程序声明]…]
END [package_name];
包体定义的语法如下:
CREATE [OR REPLACE] PACKAGE BODY package_name {IS | AS}
[私有数据类型定义[私有数据类型定义]…] [私有变量、常量声明[私有变量、常量声明]…] [私有子程序声明和定义[私有子程序声明和定义]…] [公有子程序定义[公有子程序定义]…] BEGIN PL/SQL 语句
END [package_name];
PL/SQL 允许对包内子程序和本地子程序进行重载。所谓重载时指两个或多个子程序有相同的名称,但拥有不同的参数变量、参数顺序或参数数据类型。
使用 DROP PACKAGE 命令对不需要的包进行删除。