触发器

mac2022-06-30  21

触发器   触发器不用显式调用,是由一些 数据库操作自动触发。例如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;

 

转载于:https://www.cnblogs.com/yunman/p/5497812.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)