ORA-04091: таблица изменяется при использовании курсора в триггере для вставки в другую таблицу - PullRequest
0 голосов
/ 20 ноября 2018
create table dept(dno number(3) primary key)
create table emp(eno number(3) primary key,dno number(3) references dept)
create table emp_cnt(dno number(3),cnt number(3),foreign key(dno) references dept)

insert all
into dept values(101)
into dept values(102)
into dept values(103)
into dept values(104)
into dept values(105)
select * from dual

create or replace trigger count_emp after insert or update or delete on emp for each row
declare
cursor c1 is select dno,count(eno) cnt from emp group by dno;
begin
for row in c1
loop
insert into emp_cnt(dno,cnt) values(row.dno,row.cnt);
end loop;
end;

insert into emp values(1,101)

, когда я пытаюсь вставить данные в таблицу 'emp', как в приведенном выше выражении, появляется ошибка, сообщающая, что моя таблица 'emp' мутирует.Ниже я показал точную ошибку, которая показывает

ORA-04091: table SYSTEM.EMP is mutating, trigger/function may not see it
ORA-06512: at "SYSTEM.COUNT_EMP", line 2
ORA-06512: at "SYSTEM.COUNT_EMP", line 4
ORA-04088: error during execution of trigger 'SYSTEM.COUNT_EMP'
1. insert into emp values(1,101)

с последней вставкой, которую я вставляю в таблицу emp, которая вызовет триггер emp_count, в этом триггере, который я используюкурсор для подсчета количества сотрудников в каждом отделе, а затем я вставляю эти данные курсора в таблицу emp_cnt

1 Ответ

0 голосов
/ 20 ноября 2018

Как упомянуто в комментариях, вы не можете запрашивать или изменять таблицу, которая является владельцем Trigger, что, если вы делаете, вызывает ошибку.

Trigger не предназначен для таких требований.Вместо этого используйте View.

create or replace view  emp_cnt
 AS
 select dno,count(eno) cnt from emp 
group by dno;


insert into emp values(1,101);
insert into emp values(2,101);
insert into emp values(3,102);


select * from  emp_cnt;

DNO CNT
102 1
101 2

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...