资源描述:
《在PL-SQL中编写触发器》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、在PL/SQL中编写触发器----------------------------------触发器---------------------------------创建测试表--createtablet1(t1_idnumberprimarykey,t1_namevarchar2(20))--创建序列--dropsequenceseq_t1_idcreatesequenceseq_t1_id--测试--insertintot1(t1_id,t1_name)values(seq_t1_id.nextval,'a');insertintot1(t
2、1_id,t1_name)values(seq_t1_id.nextval,'b');insertintot1(t1_id,t1_name)values(seq_t1_id.nextval,'c');commit;--编写触发器,实现id的自动增长--createorreplacetriggertr_t1_autoIdbeforeinsertont1foreachrowbeginselectseq_t1_id.nextvalinto:new.t1_idfromdual;end;insertintot1(t1_name)values('d');i
3、nsertintot1(t1_name)values('e');insertintot1(t1_name)values('f');commit;----实现工资只能增加,不能减少--createorreplacetriggertr_emp_salbeforeupdateonempforeachrowdeclarebeginif(:old.sal>:new.sal)thenraise_application_error(-20009,'老板,我每天都努力工作,怎么能减我的工资呢');endif;end;updateempsetsal=1000wh
4、ereempno=7002;---使用条件谓词-----------------------更新员工工资,只能增加,不能减少;删除员工,不能删除项目经理--createorreplacetriggertr_emp_salbeforeupdateordeleteonempforeachrowbeginifupdatingthenif(:old.sal>:new.sal)thenraise_application_error(-20009,'老板,我每天都努力工作,怎么能减我的工资呢');endif;endif;ifdeletingthenif(:
5、old.job='MANAGER')thenraise_application_error(-20009,'不能删除项目经理');endif;endif;end;select*fromempdeletefromempwhereempno=7566---添加员工,超过3人不能添加--createorreplacetriggertr_emp_addbeforeinsertonempforeachrowdeclarev_countnumber;beginselectcount(*)intov_countfromempwheredeptno=:new.
6、deptno;ifv_count>=3thenraise_application_error(-20010,'此部门人数太多,不能再添加');endif;end;selectdeptno,count(*)ascountsfromempgroupbydeptnoinsertintoemp(empno,ename,sal,deptno)values(6001,'大傻',3000,50)----修改部门编号,该部门的员工部门编号也随之变化---createorreplacetriggertr_dept_update_deptnoafterupdate
7、ofdeptnoondeptforeachrowbeginupdateempsetdeptno=:new.deptnowheredeptno=:old.deptno;end;--测试--select*fromdeptselect*fromempupdatedeptsetdeptno=21wheredeptno=20-----看新记录的id是几?--createorreplacetriggertr_t1beforeinsertont1foreachrowdeclarev_maxt1.t1_id%type;beginselectmax(t1_id)
8、intov_maxfromt1;dbms_output.put_line(v_max);:new.t1_id:=nvl(v_max,0)+1;end;