最近, 老项目新增了日报优化的需求我用 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;
来源: http://www.linuxidc.com/Linux/2018-04/152050.htm