ORACLE触发器、内置程序包教学
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle 第8章触发器、内置程序包
1、技术目标
∙应用触发器
∙使用内置程序包
2、什么是触发器
∙触发器是当特定事件出现时自动执行的存储过程
∙特定事件可以是执行更新的DML语句和DDL语句
∙触发器不能被显式调用,存储过程可以显示调用
触发器的功能有:
∙自动生成数据
∙自定义复杂的安全权限
∙提供审计和日志记录
∙启用复杂的业务逻辑
触发器可以与特定的表或视图相关联,用于检查对表/视图所做的数据修改,
当执行insert、delete、update语句时,可激活触发器代码
3、如何创建触发器
创建触发器的语法为:
CREATE [OR REPLACE] TRIGGER trigger_name {AFTER | BEFORE | INSTEAD OF}
{insert | delete | update [OF column[, column] ...]} [OR {insert | delete | update [OF column[, column] ...] }] ON
[schema.]table_or_view_name
[REFERENCING [NEW AS new_row_name] [OLD AS
old_row_name]]
[FOR EACH ROW]
[WHEN (condition)]
[DECLARE
variable_declation]
BEGIN
statements;
[EXCEPTION
exception_handlers]
END [trigger_name];
语法说明:
AFTER | BEFORE,指在事件发生之前或之后激活触发器INSTEAD OF,表示可以执行触发器代码来代替导致触发器调用的事件
insert | delete | update,指定构成触发器事件的数据操纵类型,update可指定列列表
REFERENCING,指定新行(即将更新)和旧行(更新前)的其他名称,默认为NEW和OLD
table_or_view_name,指要创建触发器的表或视图的名称
FOR EACH ROW,指定是否对受影响的每行都执行触发器,即行级触发器,
如不使用此句,则为语句级触发器
WHEN,限制执行触发器的条件,该条件可包括新旧数据值的检查DECLARE...END,一个标准的PL/SQL块
使用:在Emp表创建触发器,
Sql代码
1.CREATE OR REPLACE TRIGGER biu_emp_deptno
2.--在添加或修改deptNo字段之前触发
3.BEFORE INSERT OR UPDATE OF deptNo
4.ON Emp
5.--行级触发器
6.FOR EACH ROW
7.--列deptNo的新值不等于40
8.WHEN (New.deptNo <> 40)
9.BEGIN
10.--将comm列设置为0
11.:m := 0;
12.END;
13./
注意:使用SHOW ERRORS命令可查看创建触发器时出现的错误
4、触发器的组成部分
触发器由以下3个部分组成:
触发语句,定义激活触发器的DML 事件和DDL 事件,如:BEFORE INSERT OR UPDATE OF deptNo
ON Emp
--行级触发器
FOR EACH ROW
这段代码表示,当对Emp表执行insert语句或对Emp表的deptNo列执行update语句时,触发器会在受影响的每一行
上执行一次
触发限制,执行触发器的条件,该条件必须为真才能激活触发器,如:
--列deptNo的新值不等于40,触发器会执行
WHEN (New.deptNo <> 40)
触发操作,一些SQL 语句和代码,在发出了触发器语句且触发限制的值为真时运行,如:
BEGIN
--将comm列设置为0
:m := 0;
END;
5、触发器的类型及使用
触发器有如下的类型:
每种触发器的作用:
使用1:应用行级触发器,
Sql代码
1.--创建表TEST_TRG
2.CREATE TABLE TEST_TRG (ID NUMBER, NAME VARCHAR2(20));
3.--创建序列SEQ_TEST
4.CREATE SEQUENCE SEQ_TEST;
5.--为TEST_TRG表创建行级触发器
6.CREATE OR REPLACE TRIGGER BI_TEST_TRG
7.--在insert(添加)或者update(修改)ID字段时触发
8.BEFORE INSERT OR UPDATE OF ID
9.ON TEST_TRG --指定TEST_TRG表
10.FOR EACH ROW --设置为行级触发器
11.--触发器语句部分
12.BEGIN
13.--判断是不是insert语句
14.IF INSERTING THEN
15.--如果是insert操作,将序列的值设置给ID列
16.SELECT SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL;