2013-05-03 28 views
0

我在桌上有不同車的數量,每輛車都有自己的價格。 每當有東西被更新或表中插入新行時,我需要重新計算和更新平均價格。觸發突變問題

我試圖使用觸發器內部AVG()功能卻突然得到運行時錯誤: ORA-04091: table abcde.SCL is mutating, trigger/function may not see it

我認爲解決方案是使用語句而不是行觸發器觸發。在這種情況下,語句觸發器不允許使用:new.ID or :old.ID,那麼如何檢測哪個汽車品牌更新,以重新計算平均值?對付這種情況

create or replace trigger AvgTrigger 
after insert on cars 
for each row 
declare  
    carAvg number; 
begin 
    SELECT Avg(price) into carAvg from car where id# = :new.id#;  
end; 
+0

在選擇列表中定義一個汽車視圖,其中avg(價格)超過(由id#分區)carAvg'。我猜。您顯示的觸發器沒有數據修改,平均計算沒有輸出,因此可以完全刪除。 – 2013-05-03 20:18:47

+0

觸發器尚未完成,這是一個原因。 – 2013-05-03 20:27:51

+0

http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936基本上問題是在觸發器運行時表格正在改變。這是一個複雜的交易,讓我們讓湯姆凱特回答你的問題。 – 2013-05-03 21:08:39

回答

2

一種方法是使用一個行級觸發器來記錄一些信息,比如修改了編號,在臨時表中,然後用一個語句級觸發器來讀取信息並執行所需的工作。

但是,在這種情況下,我會質疑這是否值得。考慮在需要時計算查詢中的平均值;或者如Shannon的評論所暗示的那樣將其嵌入到視圖中;或者如果在運行中對其進行計算會導致開銷過大,則將其嵌入到物化視圖中。