触发器

触发器
  触发器不用显式调用,是由一些
数据库操作自动触发。例如insert,
update,delete等动作触发,也可以
由登录或登出等事件触发。
  触发器分类:
   *a.DML触发器
     由DML语句操作触发.DML触发器
   又分为语句级触发器和行级触发器。
   语句级:对表执行insert,delete,
     update时触发调用一次。
   行级:每行记录调用一次触发器功能
    行级触发器可以获取当前操作的记录
 
   b.系统触发器
     由系统事件触发,比如登录,登出
 
  DML触发器创建格式:
create or replace trigger 触发器名
before|after ?事件类型 on 表
declare
 --定义区
begin
 --主处理区
exception
 --异常处理区
end;
/
 
案例:
create or replace trigger mytrigger1
after delete or insert on emp
declare
  v_num number(5);
  v_avg number(7,2);
begin
  select count(*),avg(sal)
  into v_num,v_avg
  from emp;
  dbms_output.put_line('总人数'||v_num);
  dbms_output.put_line('平均工资'||v_avg);
end;
/
 
案例:删除EMP记录时,将被删除记录
添加到EMP_BAK备份表。
  有一个EMP_BAK表,用于备份已删除
的员工EMP记录。
 
------创建EMP_BAK表------
create table EMP_BAK(
  empno number(4),
  ename varchar2(20),
  sal number(7,2),
  deptno number(4),
  hire_date date
);
------触发器--------
create or replace trigger emp_bak_trigger
before delete on emp
for each row
declare
begin
  --将要删除的记录写入EMP_BAK
  --:OLD表示EMP表要删除的记录
  insert into emp_bak values
   (:OLD.empno,:OLD.ename,
    :OLD.sal,:OLD.deptno,
    :OLD.hiredate);
end;
/
在行级触发器中,可以使用:OLD或:NEW
表示当前操作的记录。
insert操作 :NEW表示要插入的记录
delete操作 :OLD表示要删除的记录
update操作 :NEW表示更新后的记录
           :OLD表示更新前的记录
 
=======案例=========
电话记录表PHONE_DETAIL
--主键ID
--电话号码PHONE_NO
--记录时间CREATE_TIME (使用当前系统时间)
--通话时长(分钟)DURATION
--通话资费类型COST_ID
--通话费用COST (单价*时长)
create table phone_detail(
  id number(11) primary key,
  phone_no varchar2(20),
  create_time date,
  duration number(10),
  cost_id number(11),
  cost number(11,2)
);
create sequence phone_seq;
 
 
服务资费表PHONE_COST
--资费COST_ID
--资费名COST_NAME
--单价(元/分钟)COST_PRICE
create table phone_cost(
  cost_id number(11) primary key,
  cost_name varchar2(20),
  cost_price number(5,2)
);
insert into phone_cost
   values (1,'A资费',1.5);
insert into phone_cost
   values (2,'B资费',0.5);
insert into phone_cost
   values (3,'C资费',0.3);
 
需求:当向PHONE_DETAIL表中插入记录
时,采用触发器自动计算出通话费用
COST字段值写入。
 
 insert into PHONE_DETAIL
 (id,phone_no,duration,
  cost_id,create_time)
 values (phone_seq.nextval,
   '13111111112',8,3,sysdate);
 
 上述insert执行后,自动计算出cost值写入
 =====触发器=======
create or replace trigger cost_trigger
before insert on PHONE_DETAIL
for each row
declare
 v_price number(7,2) :=0;
 v_cost number(7,2) :=0;
begin
  --根据插入的cost_id值去
  --phone_cost获取cost_price
    select cost_price into v_price
    from phone_cost
    where cost_id=:NEW.cost_id;
  --利用cost_price*插入的时长计算费用
    v_cost := v_price*:NEW.duration;
  --将计算出来得费用写入记录的cost字段
    :NEW.cost := v_cost;
end;

 

posted @ 2016-05-16 13:41  YunMan  阅读(134)  评论(0编辑  收藏  举报