2014-12-07 6 views
0

У меня есть требование вызывать хранимую процедуру с помощью триггера «после вставки» всякий раз, когда данные вставляются в таблицу, но я запускаю «ошибку ORA-04091: table TEST. 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' в производственной системе. Итак, зачем вам нужна процедура, которая ничего не делает? –

+0

Измените процедуру, чтобы ответить на ваш вопрос. Данный сценарий является образцом для более легкого понимания. –

ответ

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; 
/

 Смежные вопросы

  • Нет связанных вопросов^_^