oracle触发器的基本概念和基本语法

触发器概述
触发器是指被隐含执行的存储过程,它可以用pl/sql进行开发
当发生特定事件(如修改表,创建表,登录到数据库)时,oracle会自动执行触发器的相应代码

触发器类型:
Dml触发器:在对数据库表进行DML操作时触发,并且可以对每行或者语句操作上进行触发。
替代触发器:oracle8专门为进行视图操作的一种触发器
系统触发器:对数据库系统事件进行触发,如启动、关闭等。
触发器由触发事件、触发条件和触发操作3个部分组成。
注意:
1、触发器不接受参数
2、一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个。并各触发器之间不能有矛盾。
3、一个表上的触发器越多,该表上的DML操作的性能影响就越大
4、触发器代码的大小不能超过32K。如需要大量的代码创建触发器,则首先创建过程,然后在触发器中使用CALL语句调用过程
5、触发器代码只能包含SELECT、INSERT、UPDATE和DELETE语句,
6、不能包含DDL语句(CREATE、ALTER和DROP)和事务控制语句(COMMIT、ROLLBACK和SAVEPOINT)
语句触发器的语法
create [or replace] trigger trigger_name
Before/after
Insert/delete/update [of column [, column …]]
On [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new}]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;
实例:
create or replace trigger tri_option_dept
before
insert or update or delete
on dept
begin
if to_char(sysdate,‘day’) in (‘星期四’,‘星期六’) then
case
when inserting then
raise_application_error(-20000,‘周六或周四不能进行录入操作’);
when updating then
raise_application_error(-20001,‘周六或周四不能进行修改操作’);
when deleting then
raise_application_error(-20002,‘周六或周四不能进行删除操作’);
end case;
end if;
end;
触发器执行顺序:

  1. 执行 BEFORE语句级触发器;
  2. 对与受语句影响的每一行:
    执行 BEFORE行级触发器
    执行 DML语句
    执行 AFTER行级触发器
  3. 执行 AFTER语句级触发器
    创建instead of 触发器
    为了在不能执行DML操作的复杂视图上执行DML操作,必须基于视图创建INSTEAD OF触发器
    创建INSTEAD OF触发器时需要注意以下几点
    INSTEAD OF选项只适用于视图
    当基于视图创建触发器时,不能指定BEFORE和AFTER选项
    CREATE [OR REPLACE] TRIGGER trigger_name
    INSTEAD OF
    {INSERT | DELETE | UPDATE [OF column [, column …]]}
    [OR {INSERT | DELETE | UPDATE [OF column [, column …]]}…]
    ON [schema.] view_name --只能定义在视图上
    [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
    [FOR EACH ROW ] --因为INSTEAD OF触发器只能在行级上触发,所以没有必要指定
    [WHEN condition]
    PL/SQL_block | CALL procedure_name;

总结:
游标:
定义游标
CURSOR cursor_name IS select_statement;
打开游标
OPEN cursor_name;
提取数据
FETCH cursor_name INTO variable1,variable2,…;
关闭游标
CLOSE cursor_name;
触发器:
create or replace trigger tri_pro
after[before] insert or update or delete on dept
for each row
[when(old.deptno=30)]
begin
pro_addOldDept(:old.deptno,:old.dname,:old.loc);
end;

你可能感兴趣的:(oracle触发器的基本概念和基本语法)