码迷,mamicode.com
首页 > 数据库 > 详细

Oracle触发器详解

时间:2015-06-11 21:20:36      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

 

开始:

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、触发器的组成部分:

1、 触发器名称

2、 触发语句

3、 触发器限制

4、 触发操作

   1.1、触发器名称

create trigger biufer_employees_department_id

 

命名习惯:

biuferbefore insert update for each row

employees表名

department_id列名

   1.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的时候

   1.3、触发器限制

when (new_value.department_id<>80 )

限制不是必须的。此例表示如果列department_id不等于80的时候,触发器就会执行。

其中的new_value是代表更新之后的值。

   1.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, ‘donny@hotmail.com’,60,10000,.25);

select commission_pct from employees where employee_id=12345;

触发器不会通知用户,便改变了用户的输入值。

2、触发器的类型有:

触发器类型:

1、 语句触发器

2、 行触发器

3、INSTEAD OF触发

4、 系统条件触发器

5、 用户事件触发器

 

2.1、语句级触发器.(语句级触发器对每个DML语句执行一次)

      是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERTUPDATEDELETE或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论update多少行,也只会调用一次update语句触发器。

实例:

create or replace trigger tri_test

after insert or update or delete on test

begin

if updating then

dbms_output.put_line(‘修改‘);

elsif deleting then

dbms_output.put_line(‘删除‘);

elsif inserting then

dbms_output.put_line(‘插入‘);

end if;

end; 

 

2.2、行级触发器.(行级触发器对DML语句影响的每个行执行一次)

实例一:

--触发器

--行级触发器

create table test(sid number,sname varchar2(20));--创建一个表

create sequence seq_test;--创建序列

 

create or replace trigger tri_test--创建触发器

before insert or update of sid on test

for each row--触发每一行

begin

if inserting then

select seq_test.nextval into:new.sid from dual;

else

raise_application_error(-20020,‘不允许更新ID值!‘);--中断程序

end if;

end; 

--测试,插入几条记录

insert into test values(0,‘ff‘);

insert into test values(0,‘ff‘);

insert into test values(0,‘tt‘);

 

实例二:

--创建一个触发器,无论用户插入新记录,还是修改emp表的job列,都将用户指定的job列的值转换成大写.

create or replace trigger trig_job

before insert or update of job

on emp

 

Oracle触发器详解

标签:

原文地址:http://my.oschina.net/hnqingping1255/blog/465756

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!