下面的代码给出了一个变异错误。
任何人都可以帮助解决这个问题吗?
CREATE OR REPLACE TRIGGER aso_quote_cuhk_trigger
BEFORE INSERT
ON aso.aso_quote_headers_all
FOR EACH ROW
BEGIN
UPDATE aso.aso_quote_headers_all
SET quote_expiration_date=sysdate+90
where quote_header_id=:new.quote_header_id;
END;
/
在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;
/
EDITRajesh 提到,在插入新行之前,OP 可能希望更新该行中的所有其他记录aso_quote_headers_all
table.
嗯,这是可行的,但是有点棘手。要正确执行此操作,您将需要
- 一个 pl/sql 包和包头中由触发器修改的变量。该变量可以是一个包含新插入记录 ID 的列表。插入触发器后的行级别会将新 ID 添加到列表中。这个包变量的内容对于每个不同的会话都会不同,所以我们称这个变量为
session_variable
.
- 插入触发器后的行级别,这会将新 ID 添加到
session_variable
.
- 插入触发器后的表级别将从
session_variable
,处理ID,然后将其从session_variable
。该触发器可以对 aso_quote_headers_all 执行必要的选择/更新。处理新插入的 ID 后,此触发器应确保将其从session_variable
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)