在oracle中有兩個級別的觸發器:行級別和表級別。
行級觸發器被執行for each row
。即使語句改變了多於一行,也會爲每個語句執行表級觸發器。
在行級觸發器中,您無法選擇/更新觸發器的表本身:您將得到一個突變錯誤。
在這種情況下,不需要UPDATE語句。剛剛嘗試這一點:
CREATE OR REPLACE TRIGGER aso_quote_cuhk_trigger
BEFORE INSERT
ON aso.aso_quote_headers_all
FOR EACH ROW
BEGIN
:new.quote_expiration_date=sysdate+90;
END;
/
編輯拉傑什提到這是可能的,在插入新行之前,OP想在aso_quote_headers_all
表更新所有其他記錄。
嗯,這是可行的,但它有點棘手。要正確執行此操作,您將需要
- 一個pl/sql包和包頭中的一個變量,該變量由觸發器修改。這個變量可以是一個包含新插入記錄ID的列表。插入觸發器後的行級別會將新ID添加到列表中。這個包變量的內容對於每個不同的會話都會有所不同,所以我們稱這個變量爲
session_variable
。
- 插入觸發後的行級別,這會將新ID添加到
session_variable
。
- 插入觸發器後的表級別將從
session_variable
獲得ID,處理該ID並將其從session_variable
中刪除。該觸發器可以在aso_quote_headers_all上執行必要的選擇/更新。在處理新插入的ID後,此觸發器應確保將其從session_variable
中移除。
你真的需要觸發器嗎?請看http://www.dba-oracle.com/t_avoiding_mutating_table_error。htm –