在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 –