PLSQL_trigger无法编译

时间:2017-04-03 02:41:09

标签: plsql

我需要创建一个触发器,当从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;

1 个答案:

答案 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}}