标签:
触发器
触发器不用显式调用,是由一些
数据库操作自动触发。例如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;
触发器
标签:
原文地址:http://www.cnblogs.com/yunman/p/5497812.html