我需要创建一个触发器,当从emp表中删除dept的最后一个雇员时,dept会从dept表中删除。
emp(empno,ename,deptno)
dept(deptno,dname)
首先,我创建了一个过程,在给定deptno的情况下从dept表中删除dept。
CREATE OR REPLACE PROCEDURE del_dept
(v_dno in number)
is
begin
delete from DEPT where deptno = v_dno;
end;
然后我创建了一个触发器,当删除该dept中的最后一个emp时删除dept。我尝试通过删除deptno10中的三个emp之一来测试触发器,但是我从命令中获得了错误消息,触发器无效且重新验证失败。
create or replace trigger del_dept
after delete on EMP
for each row
DECLARE
emp_count Number;
g_dno Number;
begin
SELECT COUNT(:old.ename) INTO emp_count FROM emp group by deptno;
FOR i IN 1.. emp_count LOOP
IF i = emp_count THEN
del_dept(g_dno);
end if;
END LOOP;
End;
答案 0 :(得分:0)
错误trigger is invalid and failed re-validation
指定使用编译错误创建了yor触发器,因此您无法对其进行测试。在您的案例中编写触发器不是一个好主意。我可以在你的代码中看到一些问题。所以我们先解决这些问题。
当您编写下面的代码时,您的触发器将被编译并且将是有效的。因此,您不会收到错误trigger is invalid and failed re-validation
CREATE OR REPLACE TRIGGER del_dept
AFTER DELETE
ON EMP
FOR EACH ROW
DECLARE
EMP_CNT NUMBER;
BEGIN
SELECT COUNT (1)
INTO emp_cnt
FROM emp
WHERE deptno = :old.deptno;
IF emp_cnt = 0
THEN
---del_dept is your procedure to delete records from dept table
del_dept (:old.deptno);
END IF;
END;
但是当你试图执行它时,你会进一步得到错误:
ORA-04091:表EMP正在变异,触发/功能可能看不到它
ORA-06512:在“DEL_DEPT”,第4行ORA-04088:执行期间出错
触发'DEL_DEPT'
出现此错误的原因是您尝试从select
table
deleting
oracle
进行CREATE OR REPLACE PROCEDURE del_dept (dept_no NUMBER)
IS
EMP_CNT NUMBER;
BEGIN
SELECT COUNT (1)
INTO emp_cnt
FROM emp
WHERE deptno = dept_no;
IF emp_cnt = 0
THEN
del_dept (dept_no);
END IF;
END;
以及{{1}}中不允许的记录。
您的案例的最佳方法是编写一个过程,该过程将从您的dept表中删除最后一个员工数据后删除记录。见下文:
{{1}}