今天接到一個任務,需要修改觸發器,因為好久都沒有看過關於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;
需求:建立觸發器,將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 表示訪問操作後列的值
觸發器中賦值使用:= (切記)