我正在编写一个触发器,一旦拥有多个银行帐户的用户的所有余额总和超过 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) 但我需要在更新后计算总和。
一个选项是从 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;