资源描述:
《oracle plsql编程之八-把触发器说透》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、ORACLEPL/SQL编程之八:把触发器说透摘自和讯网特性INSERTUPDATEDELETEOLDNULL实际值实际值NEW实际值实际值NULL 例1:建立一个触发器,当职工表emp表被删除一条记录时,把被删除记录写到职工表删除日志表中去。 CREATETABLEemp_hisASSELECT*FROMEMPWHERE1=2; CREATEORREPLACETRIGGERtr_del_emp BEFOREDELETE指定触发时机为删除操作前触发 ONscott.emp FOREACHROW说明创建的是行级
2、触发器 BEGIN 将修改前数据插入到日志记录表del_emp,以供监督使用。 INSERTINTOemp_his(deptno,empno,ename,job,mgr,sal,comm,hiredate) VALUES(:old.deptno,:old.empno,:old.ename,:old.job,:old.mgr,:old.sal,:old.comm,:old.hiredate); END; DELETEempWHEREempno=7788; DROPTABLEemp_his; DROPTRIG
3、GERdel_emp; 例2:限制对Departments表修改(包括INSERT,DELETE,UPDATE)的时间范围,即不允许在非工作时间修改departments表。 CREATEORREPLACETRIGGERtr_dept_time BEFOREINSERTORDELETEORUPDATE ONdepartments BEGIN IF(TO_CHAR(sysdate,"DAY")IN("星期六","星期日"))OR(TO_CHAR(sysdate,"HH24:MI")NOTBETWEEN"08
4、:30"AND"18:00")THEN RAISE_APPLICATION_ERROR(-20001,"不是上班时间,不能修改departments表"); ENDIF; END; 例3:限定只对部门号为80的记录进行行触发器操作。 CREATEORREPLACETRIGGERtr_emp_sal_comm BEFOREUPDATEOFsalary,commission_pct ORDELETE ONHR.employees FOREACHROW WHEN(old.department_id=80
5、) BEGIN CASE WHENUPDATING("salary")THEN IF:NEW.salary:old.salaryTHEN RAISE_APPLICATION_ERROR(-20001,"部门80的人员的工资不能降"); ENDIF; WHENUPDATING("commission_pct")THEN IF:NEW.commission_pct:old.commission_pctTHEN RAISE_APPLICATION_ERROR(-20002,"部门80的人员的奖金不能降");
6、 ENDIF; WHENDELETINGTHEN RAISE_APPLICATION_ERROR(-20003,"不能删除部门80的人员记录"); ENDCASE; END; /* 实例: UPDATEemployeesSETsalary=8000WHEREemployee_id=177; DELETEFROMemployeesWHEREemployee_idin(177,170); */ 例4:利用行触发器实现级联更新。在修改了主表regions中的region_id之后(AFTER),级联的、自动
7、的更新子表countries表中原来在该地区的国家的region_id。 CREATEORREPLACETRIGGERtr_reg_cou AFTERupdateOFregion_id ONregions FOREACHROW BEGIN DBMS_OUTPUT.PUT_LINE("旧的region_id值是"
8、
9、:old.region_id
10、
11、"、新的region_id值是"
12、
13、:new.region_id); UPDATEcountriesSETregion_id=:new.region_id
14、 WHEREregion_id=:old.region_id; END; 例5:在触发器中调用过程。 CREATEORREPLACEPROCEDUREadd_job_history (p_emp_idjob_history.employee_id%type ,p_start_datejob_histor