ORA-04091: 表 ExpenseTable 正在发生变化,触发器/函数可能看不到它

Abu*_*aeb 5 trigger oracle oracle-11g insert

我有两个表和一个触发器,并且正在ProjectsTable像这样插入值:

CREATE TABLE ProjectsTable
(
  ProjectID     NUMBER(6) NOT NULL,
  ProjectName   VARCHAR2(200) NOT NULL,
  Cost      NUMBER(10,2),
  ExpenseTotal  NUMBER(10,2),
  CostRemaining     NUMBER(10,2),
  PRIMARY KEY (ProjectID)
);

CREATE TABLE ExpenseTable
(
  ID            NUMBER(6) NOT NULL,
  ProjectID     NUMBER(6) NOT NULL,
  ExpenseAmount NUMBER(10,2),
  ExpenseDate   NUMBER(4),
  CONSTRAINT fk
  FOREIGN KEY (ProjectID)
  REFERENCES ProjectsTable(ProjectID)  
); 

CREATE TRIGGER ExpenseSum AFTER INSERT ON ExpenseTable FOR EACH ROW
BEGIN
    UPDATE ProjectsTable P
    SET ExpenseTotal = 
    (SELECT SUM(ExpenseAmount) from ExpenseTable
    where ExpenseTable.ProjectID= P.ProjectID)
    where P.ProjectID = :New.ProjectID;
END;
/

INSERT INTO ProjectsTable VALUES (101,'AAA',5000,0,5000);
INSERT INTO ProjectsTable VALUES (102,'BBB',3000,0,3000);
INSERT INTO ProjectsTable VALUES (103,'CCC',2000,0,2000);
Run Code Online (Sandbox Code Playgroud)

但是当我尝试将值插入ExpenseTable表中时,它给了我以下错误:

第 1 行错误:ORA-04091:表 ExpenseTable 正在发生变化,触发器/函数可能看不到它
ORA-06512:在 ExpenseSum,第 2 行
ORA-04088:触发器 ExpenseSum 执行期间出错

Bal*_*app 0

最简单的方法:

您不需要重新计算费用 SUM,因为您已经有了除新金额之外的费用 SUM,因此您所需要做的就是添加新金额:

CREATE TRIGGER ExpenseSum AFTER INSERT ON ExpenseTable FOR EACH ROW
BEGIN
    UPDATE ProjectsTable P
    SET ExpenseTotal =  ExpenseTotal + :New.ExpenseAmount
    where P.ProjectID = :New.ProjectID;
END;
/
Run Code Online (Sandbox Code Playgroud)