Sql 插入后触发,插入记录时错误表突变
我创建了一个触发器,当新记录插入表Sql 插入后触发,插入记录时错误表突变,sql,oracle,triggers,relational-database,sqlplus,Sql,Oracle,Triggers,Relational Database,Sqlplus,我创建了一个触发器,当新记录插入表登记时,它将更新付款表(用于账单)。我的触发器如下: CREATE OR REPLACE TRIGGER EnrollFee_trig AFTER INSERT ON Enrollment FOR EACH ROW DECLARE amount Payment.TotalPrice%TYPE; id Payment.LearnerID%TYPE; BEGIN SELECT SUM(Price) into amount FROM LearnerEnrollCo
登记时,它将更新付款
表(用于账单)。我的触发器如下:
CREATE OR REPLACE TRIGGER EnrollFee_trig
AFTER INSERT ON Enrollment
FOR EACH ROW
DECLARE
amount Payment.TotalPrice%TYPE;
id Payment.LearnerID%TYPE;
BEGIN
SELECT SUM(Price) into amount
FROM LearnerEnrollCourse_View
WHERE LearnerID = :NEW.LearnerID
AND Paid = 'N';
SELECT LearnerID into id
FROM Payment
WHERE LearnerID = :NEW.LearnerID
AND PaymentDate IS NULL;
IF SQL%FOUND THEN
UPDATE Payment
SET TotalPrice = amount
WHERE LearnerID = :new.LearnerID
AND PaymentDate IS NULL;
ELSE
INSERT INTO Payment VALUES
(PaymentID_Seq.nextval, :new.LearnerID, '', amount);
END IF;
END;
/
可以成功创建触发器。但在将新记录插入登记
表时,会出现错误,说明“表登记
正在发生变化,触发器/函数可能看不到它”。我想更具体地了解导致此问题的原因以及如何解决此问题。当我们尝试从行级触发器代码中引用查询中的触发表时,会出现变异表异常。看更多
在这种情况下,我怀疑(虽然我不知道,因为LearnerEnrollCourse\u视图没有定义)问题是由以下语句引起的:-
SELECT SUM(Price) into amount
FROM LearnerEnrollCourse_View
WHERE LearnerID = :NEW.LearnerID
AND Paid = 'N';
如果LearnerEnrollCourse\u视图引用了注册表,则会出现“变异表”错误。有很多方法可以解决这个问题,将触发器代码移动到语句级触发器中,并将数据保存在包变量中是一种解决方法,但一般来说,我认为使用触发器并不是最好的方法,触发器越多,就越有可能遇到此问题和其他问题。相反,我将为注册表提供一个api包,并将触发器代码移到其中
触发器讨论得很好是的,视图确实参考了注册
表。在语句级触发器中,如何获取新插入的列数据,例如:NEW.LearnerID?可以使用包变量将数据存储在行触发器中,然后引用语句级触发器中的包变量。然而,我并不建议你这么做。