2014-12-07 72 views
0

我有一个要求,每当数据插入到表中但是我碰到“错误ORA-04091:表测试时,通过插入后触发器来调用存储过程。 EMP变异,触发/功能可能看不到它“。我明白这个错误背后的原因,但我怎样才能通过复合触发器克服这一点,而不会影响程序?从插入后触发存储过程引发的变异表错误

create TABLE emp(
id NUMBER(4), 
emp_name VARCHAR2(30), 
dept_name VARCHAR2(10)); 

create or replace PROCEDURE emp_count(dept_name_v emp.dept_name%TYPE) as 
DECLARE 
dept_emp_count NUMBER(4) := 0; 
BEGIN 
SELECT count(*) INTO dept_emp_count FROM emp WHERE dept_name = dept_name_v; 
UPDATE dept_stat SET d_emp_count = dept_emp_count WHERE dept_name = dept_name_v; 
END; 

create or replace TRIGGER dept 
AFTER INSERT ON emp 
FOR EACH ROW 
BEGIN 
emp_count(:NEW.dept_name); 
END; 
+0

您不在生产系统中使用'DBMS_OUTPUT'。那么为什么你需要什么都不做的程序呢? – 2014-12-07 10:49:18

+0

调整程序来回答你的问题。鉴于情景是一个更容易理解的标本。 – 2014-12-07 11:45:43

回答

0

有一个在文档中的一个例子,如何创建一个复合触发器:
http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#CHDFEBFJ

只要改变几个标识符和声明在这个例子中,你会得到一个触发你的情况:

CREATE OR REPLACE TRIGGER some_trigger 
FOR INSERT ON emp 
COMPOUND TRIGGER 

TYPE dept_names_t IS TABLE OF emp.dept_name%TYPE INDEX BY SIMPLE_INTEGER; 
    dept_names dept_names_t; 
    idx  SIMPLE_INTEGER := 0; 

-- AFTER EACH ROW Section: 

    AFTER EACH ROW IS 
    BEGIN 
    idx := idx + 1; 
    dept_names(idx) := :NEW.dept_name; 
    END AFTER EACH ROW; 

AFTER STATEMENT IS 
    BEGIN 
    FOR j IN 1..idx 
    LOOP 
    emp_count(dept_names(j)); 
    END LOOP; 
END AFTER STATEMENT; 
END; 
/