我不理解它在运行代码后提示的问题,也不知道如何解决它。
CREATE OR REPLACE TRIGGER reader_workCount
AFTER INSERT ON BILL
FOR EACH ROW
DECLARE
WorkCount INTEGER;
BEGIN
SELECT Count(*),StaffNo into WorkCount
FROM BILL
WHERE to_number(to_char(CreatedDate,'mm')) = to_number(to_char(sysdate,'mm'))
GROUP BY StaffNo;
IF (WorkCount > 5)
THEN
DELETE BILL
WHERE BILL.BillNo = :NEW.BillNo;
raise_application_error(-20900,'Employee is overwork!');
END IF;
END;
在此处输入图像描述
我从评论中看到,您已经修复了编译错误,但您的逻辑仍然存在很大问题。
- 突变
您正在触发";比尔";然后尝试在触发器中从比尔中删除。如果你遇到需要运行删除的情况,你会得到一个";表发生变异错误";。行级触发器不能在他们正在处理的表上执行DML。这是一个更大的主题,但我建议你在谷歌上搜索";"改变表触发器";你会看到很多例子/解决方案等
- 并发
如果两个人同时插入BILL,而给定的员工编号已经有5个人了,他们会都看到有5个人,他们会都认为可以插入,在练习结束时,该员工编号将有6个人,这违反了规则。这是因为每个会话都无法看到其他未提交的更改。
这也需要相当多的复杂性来解决。这里有一些好的例子
https://asktom.oracle.com/pls/apex/asktom.search?tag=preventing-无子父记录