我需要在Oracle中创建一个触发器。触发器必须检查部门中的员工人数是否在1到10之间。我想知道这个问题2天了,但仍然找不到解决方案。
我写了类似这样的东西,但是我得到了一个错误:“ORA-04091:表正在变更”
CREATE OR REPLACE TRIGGER deptEmp
BEFORE INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW
DECLARE
emp_counts NUMBER;
BEGIN
SELECT COUNT(*) INTO emp_counts FROM emp WHERE emp.deptno = :NEW.deptno;
IF emp_counts > 10 OR emp_counts = 0 THEN
raise_application_error(-20000, 'Not correct number of employees in dept'):
END IF;
END;
/
3条答案
按热度按时间ghhaqwfi1#
任何部门的第一个雇员的计数为0,因此不能将其从插入中排除。
但是在插入、删除或更新之后,您需要计数,因此您应该添加一个更正变量,
MT0解释说,在
:New.deptno
为NULL的情况下,最好使用COALESCE (:NEw.deptno,:OLD.deptno)
,就像删除雇员时一样第一个
fiddle
to94eoyn2#
您可以用途:
然后,如果您有这些表:
可以创建部门和员工:
如果尝试插入过多员工:
然后,它将失败,并显示:
同样地,如果您尝试
DELETE
或UPDATE
,并让它处于无效状态,它也会失败。小提琴
cbeh67ev3#
您可以使用语句级触发器,如
而不是行级触发器,以防止表变异错误。