gpt4 book ai didi

oracle - 插入触发器后发生变异错误

转载 作者:行者123 更新时间:2023-12-02 06:06:49 24 4
gpt4 key购买 nike

下面的代码给出了一个变异错误。任何人都可以帮助解决这个问题。

    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中有两级触发器:行级和表级。

行级触发器对每一行执行。表级触发器按语句执行,即使语句更改超过一行。
在行级触发器中,您无法选择/更新具有触发器的表本身:您将收到一个变异错误。

在这种情况下,不需要 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;
/

编辑 Rajesh 提到有可能在插入新行之前,OP 希望更新 aso_quote_headers_all 表中的所有其他记录。

嗯,这是可行的,但有点棘手。要正确执行此操作,您需要

  1. 一个 pl/sql 包和包头中由触发器修改的变量。这个变量可以是一个包含新插入记录 ID 的列表。插入触发器后的行级别会将新 ID 添加到列表中。这个包变量的内容对于每个不同的 session 都会有所不同,所以我们称这个变量为session_variable
  2. 插入触发器后的行级别,这会将新 ID 添加到 session_variable
  3. 插入触发器后的表级别将从 session_variable 获取 ID,处理 ID,然后将其从 session_variable 中删除。此触发器可以对 aso_quote_headers_all 执行必要的选择/更新。在处理新插入的 ID 后,此触发器应确保将其从 session_variable 中删除。

关于oracle - 插入触发器后发生变异错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8474674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com