Использование триггера обновления соединения - PullRequest
1 голос
/ 17 апреля 2019

Я не понимаю, откуда возникла ошибка ... Следующая ошибка отображается в моем коде. Я пытался найти, но не нашел ничего полезного.

Ошибка запуска в строке: 31 в команде - удалить из Item_Requisite, где Item_ID = 104

Сообщение об ошибке - ORA-04091: таблица DB20168002.ITEM_REQUISITE мутирует, триггер / функция могут ее не видеть

ORA-06512: в "DB20168002.TR", строка 2 ORA-04088: ошибка во время выполнения триггера 'DB20168002.TR'

drop table Item_Master;
drop table Item_Requisite;
create table Item_Master(Item_ID number primary key,Description varchar2(50),Bal_Stock number);
insert into Item_Master values(101,'keyboard',80);
insert into Item_Master values(102,'lathe_machine',70);
insert into Item_Master values(103,'compass',100);
insert into Item_Master values(104,'compass',90);
insert into Item_Master values(105,'Ammeter',60);

create table Item_Requisite(Item_ID number primary key,Dept_Code varchar2(50),Quantity number);
insert into Item_Requisite values(101,'cs',30);
insert into Item_Requisite values(102,'mech',20);
insert into Item_Requisite values(103,'civil',25);
insert into Item_Requisite values(104,'chem',35);
insert into Item_Requisite values(105,'elect',80);

create or replace trigger tr
before delete 
on
Item_Requisite
for each row
begin
    MERGE INTO Item_Master t1
    USING Item_Requisite t2
    ON (t1.Item_ID=t2.Item_ID)
    WHEN MATCHED THEN 
    UPDATE SET t1.Bal_Stock=t1.Bal_Stock-t2.Quantity
    where t1.Item_ID=104;   
end;
/
delete from Item_Requisite where Item_ID=104;
/
select * from Item_Master;

1 Ответ

0 голосов
/ 17 апреля 2019

Не MERGE;вы не выполняете INSERTMERGE известен как upsert (обновление / вставка за одну операцию). UPDATE выполнит работу:

SQL> create or replace trigger tr
  2  before delete
  3  on
  4  Item_Requisite
  5  for each row
  6  begin
  7    update item_master t1 set
  8      t1.bal_stock = t1.bal_stock - :old.quantity
  9      where t1.item_id = 104
 10        and :old.item_id = t1.item_id;
 11
 12  --    MERGE INTO Item_Master t1
 13  --    USING Item_Requisite t2
 14  --    ON (t1.Item_ID=t2.Item_ID)
 15  --    WHEN MATCHED THEN
 16  --    UPDATE SET t1.Bal_Stock=t1.Bal_Stock-t2.Quantity
 17  --    where t1.Item_ID=104;
 18  end;
 19  /

Trigger created.

SQL> delete from Item_Requisite where Item_ID=104;

1 row deleted.

SQL> select * from Item_Master;

   ITEM_ID DESCRIPTION                                         BAL_STOCK
---------- -------------------------------------------------- ----------
       101 keyboard                                                   80
       102 lathe_machine                                              70
       103 compass                                                   100
       104 compass                                                    55
       105 Ammeter                                                    60

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