2 つのテーブルを作成しました: INFORMATION
AND 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);
したがって、2 番目のタプル (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 値を自動的に反映できるようにするためのより良いアプローチはありますか?[回答必須]