最近,老项目新增了日报优化的需求我用Oracle触发器去实现当数据插入或者更新的时候,实现对日报表数据更新操作。之前学习数据库的时候,有碰到过触发器,但都是一跳而过,也没怎么去真正的实践,这次就权当再次去学习吧~~
1.触发器实例:
--创建触发器 create or replace trigger test_trigger2 --触发器是在insert或update动作之后执行的 after insert or update --作用于dms.kqm_leaveapply表的每一行 on dms.kqm_leaveapply --这里默认为new ,old 怕与其他变量有冲突,则做了修改 referencing new as new_val old as old_val for each row --触发器限制条件 when (new_val.statusname = '核准') --触发器描述语句中,新数据使用new_val进行引用,在下面的操作语句中,新数据使用:new_val进行引用
declare --声明变量 st_str varchar2(100); et_str varchar2(100);
time1 number; time2 number; ...... begin ......
--查询结果集,进行遍历
for daylist in ( --查询出指定时间段内的所有日期 select to_char(:new_val.startdate+rownum-1,'yyyymmdd') as dd from dual connect by rownum <= trunc(:new_val.enddate - :new_val.startdate)+1 ) loop --写要进行操作的逻辑 ...... --更新另外一张表的数据 update dms.d_dailyreport_t d set d.shours = (8 - ItemValue) where d.personcode = :new_val.workno and to_char(d.ftime,'yyyy/mm/dd') like to_char(daylist.dd,'yyyy/mm/dd') ;
end loop; --substr()数据截取 st_str :=substr(:new_val.starttime,1,2) || substr(:new_val.starttime,4,2) ; et_str := substr(:new_val.endtime,1,2) || substr(:new_val.endtime,4,2) ; time1 := to_number(st_str); time2 := to_number(et_str);
if(Item_m<0) then Item_m := Item_m *(-1); tHour := tHour -1; end if;
end test_trigger2;