2014-12-07 75 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; 
/