我创建了 2 个表:INFORMATION
和FEED
。
INFORMATION has 2 attributes : ID(Primary Key), TOT_AMOUNT.
FEED has 4 attributes : ID(Foreign key refer INFORMATION(ID)), S_AMOUNT, S_DATE, TOT_REM.
现在,我必须TOT_REM
根据 和 的插入/删除/更新S_AMOUNT
向/从 插入/更新/删除值TOT_AMOUNT
。
样本内容为:
INFORMATION Table
------------------
ID | TOT_AMOUNT
1 | 100
2 | 20
3 | 50
...
FEED Table
----------------------------------------
ID | S_AMOUNT | S_DATE | TOT_REM
1 | 10 |10.10.2010| 90
1 | 10 |13.10.2010| 80
1 | 30 |17.10.2013| 50
1 | 10 |20.10.2016| 40
...
我们需要在&的帮助下TOT_REM
,根据对 执行的更新/插入/删除操作自动将值插入到属性中。S_AMOUNT
TOT_AMOUNT
S_AMOUNT
在任何时候,TOT_REM 都不能小于 0。并且,TOT_REM 需要自动插入/删除/更新,这样
TOT_REM for i(at a specific date) = (TOT_AMOUNT for ID=i) -
SUM(S_AMOUNT of all instances of ID=i,
which is later than the S_DATE for ID=i);
所以,假设我们删除第二个元组(1,10,'13.10.2010',80),反映的状态BR_FEED
应该是:
FEED Table
----------------------------------------
ID | S_AMOUNT | S_DATE | TOT_REM
1 | 10 |10.10.2010| 90
1 | 30 |17.10.2013| 60
1 | 10 |20.10.2016| 50
...
我写了一个触发器,显示失败
ORA-04091: table SSUMAN.FEED is mutating, trigger/function may not see it
触发器的代码是:
CREATE OR REPLACE TRIGGER BR_INSERT_TRB
AFTER DELETE OR INSERT OR UPDATE OF S_AMOUNT ON FEED
FOR EACH ROW
BEGIN
IF DELETING THEN
UPDATE FEED bf
SET bf.TOT_REM = bf.S_AMOUNT + :OLD.S_AMOUNT;
END IF;
IF INSERTING THEN
INSERT INTO FEED (TOT_REM) VALUES(
((SELECT TOT_AMOUNT FROM INFORMATION bi WHERE bi.ID=:NEW.ID) -
(SELECT SUM(S_AMOUNT) FROM FEED bf where bf.ID=:NEW.ID) -
:NEW.S_AMOUNT);
END IF;
IF UPDATING THEN
UPDATE FEED bf
SET bf.TOT_REM = (SELECT TOT_AMOUNT FROM BR_INFORMATION bi WHERE bi.ID=bf.ID) -
(SELECT SUM(S_AMOUNT) FROM FEED bf where bf.ID=:NEW.ID) -
:NEW.S_AMOUNT
WHERE :NEW.ID IS NOT NULL;
END IF;
END;
问题 :
- 这种方法有缺陷吗?我不能通过这种方式实现我想要的吗?[可选]
- 有没有可以在这里看到的范围?我无法在那条线上思考!可能,缺乏经验... [可选]
- 有没有更好的方法,以便自动反映 TOT_REM 值?[必须回答]