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 执行期间出错
最简单的方法:
您不需要重新计算费用 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)
| 归档时间: |
|
| 查看次数: |
4680 次 |
| 最近记录: |