触发器会导致错误,因为它正在改变表

问题描述 投票:0回答:1

我正在编写一个触发器,一旦拥有多个银行帐户的用户的所有余额总和超过 10000 美元,该触发器应该将其 ID 添加到另一个表中。账户可以采用不同的货币,因此也必须以美元计算。这是触发器:

`CREATE OR REPLACE TRIGGER ADD_NEW_VIP
AFTER UPDATE OF BALANCE ON BANK_ACCOUNT
for EACH row
DECLARE
    v_sum number :=0;
BEGIN
    SELECT SUM(ba.BALANCE *c.COURSE_TO_LEV)
    INTO v_sum 
    FROM bank_account ba
    INNER JOIN currency c ON ba.CURRENCY_ID=c.currency_id
    where ba.CUSTOMER_ID =  :NEW.CUSTOMER_ID;
    IF v_sum > 100000 THEN
        INSERT INTO VIP_CUSTOMER (CUSTOMER_ID)
        VALUES (:NEW.CUSTOMER_ID);
    END IF;
END;`

它拖 SQL 错误:ORA-04091:表 STU2001321050_PROJECT.BANK_ACCOUNT 正在发生变化,触发器/函数可能看不到它 ORA-06512: 在“STU2001321050_PROJECT.ADD_NEW_VIP”,第 4 行 ORA-04088: 执行触发器“STU2001321050_PROJECT.ADD_NEW_VIP”期间出错 04091. 00000 - “表 %s.%s 正在发生变化,触发器/函数可能看不到它” *原因:触发器(或在中引用的用户定义的 plsql 函数) 这个语句)试图查看(或修改)一个表 在被触发它的语句修改的过程中。 *操作:重写触发器(或函数),使其不读取该表。

我尝试更改 select 语句,但错误仍然出现 当我尝试仅对特定 id 执行选择时,它会返回正确的总和,并且返回正确的值。我怀疑错误来自这一行 SELECT SUM(ba.BALANCE *c.COURSE_TO_LEV) 但我需要在更新后计算总和。

sql oracle plsql triggers
1个回答
0
投票

一个选项是从 SELECT 语句中删除构建触发器的表bank_account,例如

SELECT SUM( :new.balance * course_to_lev )
  INTO v_sum 
  FROM currency
 WHERE currency_id = :new.currency_id
   AND customer_id = :new.customer_id;
© www.soinside.com 2019 - 2024. All rights reserved.