遇到问题SQL语句被忽略和ORA-00947



我不理解它在运行代码后提示的问题,也不知道如何解决它。

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;

在此处输入图像描述

我从评论中看到,您已经修复了编译错误,但您的逻辑仍然存在很大问题。

  1. 突变

您正在触发";比尔";然后尝试在触发器中从比尔中删除。如果你遇到需要运行删除的情况,你会得到一个";表发生变异错误";。行级触发器不能在他们正在处理的表上执行DML。这是一个更大的主题,但我建议你在谷歌上搜索";"改变表触发器";你会看到很多例子/解决方案等

  1. 并发

如果两个人同时插入BILL,而给定的员工编号已经有5个人了,他们会看到有5个人,他们会都认为可以插入,在练习结束时,该员工编号将有6个人,这违反了规则。这是因为每个会话都无法看到其他未提交的更改。

这也需要相当多的复杂性来解决。这里有一些好的例子

https://asktom.oracle.com/pls/apex/asktom.search?tag=preventing-无子父记录

最新更新