今天接到一个任务,需要修改触发器,因为好久都没有看过关于oracle触发器的东东了,所以这里通过两个简单的小例子复习下触发器,以备忘。
1. 案例一
需求:建立触发器,判断员工工资,如果小于0,则改为0;如果大于10000,则改为10000
建表:
create table emp1(
e_id number primary key not null,
e_no number,
e_name varchar2(20),
e_sal number
)
select * from emp1;
create sequence seq_emp1_id;
建触发器:
create or replace trigger trg_add_emp
before insert or update on emp1 for each row
declare
v_e_sal emp1.e_sal%type;
begin
v_e_sal := :new.e_sal;
if v_e_sal < 0 then
v_e_sal := 0;
elsif v_e_sal > 10000 then
v_e_sal := 10000;
end if;
:new.e_sal := v_e_sal;
exception
when others then
dbms_output.put_line(sqlcode||sqlerrm);
end;
测试:
insert into emp1(e_id,e_no,e_name,e_sal) values(seq_trg_id.nextval,1,'zhangsan',100000);
commit;
insert into emp1(e_id,e_no,e_name,e_sal) values(seq_trg_id.nextval,2,'zhangxiaosan',-10);
commit;
insert into emp1(e_id,e_no,e_name,e_sal) values(seq_trg_id.nextval,3,'lisi',-10);
commit;
update emp1 set e_sal = -10 where e_id = 1;
commit;
2. 案例二:
需求:建立触发器,将emp1表删除的记录放emp2表中
建表:
create table emp2(
id number primary key not null,
e_no number,
e_name varchar2(20),
del_date date
)
select * from emp1;
create sequence seq_emp2_id;
触发器:
create or replace trigger trg_del_emp
before delete on emp1 for each row
declare
begin
insert into emp2(id, e_no, e_name, del_date) values(seq_emp2_id.nextval, :old.e_no, :old.e_name, sysdate);
exception
when others then
dbms_output.put_line(sqlcode||sqlerrm);
end;
测试:
insert into emp1(e_id,e_no,e_name,e_sal) values(seq_trg_id.nextval,3,'wangwu',999);
commit;
select * from emp1;
delete from emp1 where e_no = 3;
commit;
select * from emp1;
select * from emp2;
说明:
:old 表示访问操作前列的值
:new 表示访问操作后列的值
触发器中赋值使用:= (切记)