Database 使用updatejoin触发器
我不明白错误是从哪里来的。。。 我的代码中显示以下错误。我已尝试搜索,但未找到 任何有用的东西 从命令中的第31行开始时出错- 从项目中删除,其中项目ID=104 错误报告- ORA-04091:表DB20168002。项_必要条件正在变异,触发器/函数可能看不到它 ORA-06512:位于“DB20168002.TR”第2行 ORA-04088:执行触发器“DB20168002.TR”时出错Database 使用updatejoin触发器,database,oracle,plsql,Database,Oracle,Plsql,我不明白错误是从哪里来的。。。 我的代码中显示以下错误。我已尝试搜索,但未找到 任何有用的东西 从命令中的第31行开始时出错- 从项目中删除,其中项目ID=104 错误报告- ORA-04091:表DB20168002。项_必要条件正在变异,触发器/函数可能看不到它 ORA-06512:位于“DB20168002.TR”第2行 ORA-04088:执行触发器“DB20168002.TR”时出错 drop table Item_Master; drop table Item_Requisite;
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;
不要
合并;您没有执行任何INSERT
(而MERGE
被称为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>
不要MERGE
;您没有执行任何INSERT
(而MERGE
被称为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>
您正在尝试读取和更新创建触发器的同一个表,因此会出现错误。使用复合触发器可避免此错误您正在尝试读取和更新创建触发器的同一个表,因此会出现错误。使用复合触发器可避免此错误