Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 插入后触发,插入记录时错误表突变_Sql_Oracle_Triggers_Relational Database_Sqlplus - Fatal编程技术网

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?可以使用包变量将数据存储在行触发器中,然后引用语句级触发器中的包变量。然而,我并不建议你这么做。