Oracle触发器问题:超100小时工时未写入加班表求助
触发器问题排查与修复
原代码的核心错误
- 声明的
hoursWorked变量未赋值,始终为NULL,永远无法触发>100的判断逻辑 - 未添加
FOR EACH ROW,默认是语句级触发器,无法获取单条记录的工时数据 - 插入加班表时用全表查询
EMP_PROJ,会批量插入所有符合条件的记录,而非当前触发的目标行
修正后的触发器代码
CREATE OR REPLACE TRIGGER OVERTIME_HOURS AFTER INSERT OR UPDATE OF hoursWorked ON EMP_PROJ FOR EACH ROW -- 设置为行级触发器,逐行处理数据 BEGIN -- 通过:NEW伪记录获取当前行的最新工时值 IF :NEW.hoursWorked > 100 THEN INSERT INTO emp_proj_overtime(empNo, projNo, hourOt) VALUES (:NEW.empNo, :NEW.projNo, :NEW.hoursWorked - 100); END IF; END; /
补充说明
:NEW是Oracle触发器的内置伪记录,用于获取INSERT/UPDATE操作后当前行的字段值- 如果需要处理UPDATE场景下的历史加班记录(比如之前已插入过加班数据,现在工时更新后需要同步调整),可以额外添加删除旧记录的逻辑
- 确保
emp_proj_overtime表的字段类型、长度与EMP_PROJ对应字段一致,避免插入时出现类型不匹配错误
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

