在插入触发器后用新插入的数据更新列
Updating a column with newly inserted data after insert trigger
我有一个“Employee
”table,其中包含名为“E#
”和“TOTAL_BUDGET
”的列。
我有一个“WorkOn
”table,它显示员工正在处理的所有 P#
。
我有一个“Project
”table,其中包含名为“Budget
”、'E#'
和“P#
”的列。
我想做的是,每当一个新项目被分配给一个员工(例如插入到 WorkOn 中的新数据)时,行触发器将更新 TOTAL_BUDGET 列包含员工分配到的 所有项目 的预算。
例如,如果 员工 1 当前分配给预算 10K 的项目 1,2,3,分别为 15K 和 5K,在为员工 1[= 插入预算为 5K 的新项目 4 之后56=] 进入 WorkOn table,行触发器将为员工 1[= 更新 TOTAL_BUDGET 56=] 到 35K.
然而,我的行触发器目前所做的是,它总是在更新 TOTAL_BUDGET 列之前排除新分配的项目预算(使用上面的示例,TOTAL_BUDGET只是30K).
这是我目前所做的:
CREATE OR REPLACE TRIGGER update_budget
BEFORE INSERT on WorkOn
FOR EACH ROW
DECLARE
budget number;
BEGIN
SELECT SUM(Project.Budget) INTO budget
FROM WorkOn
INNER JOIN Project
ON WorkOn.P# = Project.P#
WHERE E# = :NEW.E#;
UPDATE Employee
SET Total_Budget = budget WHERE E# = :NEW.E#;
END;
我尝试将 BEFORE INSERT
更改为 AFTER INSERT
,但意识到我无法执行此操作,因为我正在修改变异 table。是否可以使用行触发器来完成此任务?
任何帮助将不胜感激。谢谢。
我认为您在更新员工之前忘记将新预算添加到当前预算总额中 table :
CREATE OR REPLACE TRIGGER update_budget
BEFORE INSERT on WorkOn
FOR EACH ROW
DECLARE
current_total_budget number;
project_budget number;
BEGIN
SELECT SUM(Project.Budget) INTO current_total_budget
FROM WorkOn
INNER JOIN Project
ON WorkOn.P# = Project.P#
WHERE E# = :NEW.E#;
SELECT Project.Budget INTO project_budget
FROM Project
WHERE P# = :NEW.P#;
current_total_budget := current_total_budget + project_budget;
UPDATE Employee
SET Total_Budget = current_total_budget WHERE E# = :NEW.E#;
END;
您收到变异 table 错误,因为您是 select 来自要插入到触发器体内的 table。您应该可以使用复合触发器实现您想要的。 Steven feuerstein 写了一篇很棒的文章 blog 解释了如何使用触发器解决此类问题。
我有一个“Employee
”table,其中包含名为“E#
”和“TOTAL_BUDGET
”的列。
我有一个“WorkOn
”table,它显示员工正在处理的所有 P#
。
我有一个“Project
”table,其中包含名为“Budget
”、'E#'
和“P#
”的列。
我想做的是,每当一个新项目被分配给一个员工(例如插入到 WorkOn 中的新数据)时,行触发器将更新 TOTAL_BUDGET 列包含员工分配到的 所有项目 的预算。
例如,如果 员工 1 当前分配给预算 10K 的项目 1,2,3,分别为 15K 和 5K,在为员工 1[= 插入预算为 5K 的新项目 4 之后56=] 进入 WorkOn table,行触发器将为员工 1[= 更新 TOTAL_BUDGET 56=] 到 35K.
然而,我的行触发器目前所做的是,它总是在更新 TOTAL_BUDGET 列之前排除新分配的项目预算(使用上面的示例,TOTAL_BUDGET只是30K).
这是我目前所做的:
CREATE OR REPLACE TRIGGER update_budget
BEFORE INSERT on WorkOn
FOR EACH ROW
DECLARE
budget number;
BEGIN
SELECT SUM(Project.Budget) INTO budget
FROM WorkOn
INNER JOIN Project
ON WorkOn.P# = Project.P#
WHERE E# = :NEW.E#;
UPDATE Employee
SET Total_Budget = budget WHERE E# = :NEW.E#;
END;
我尝试将 BEFORE INSERT
更改为 AFTER INSERT
,但意识到我无法执行此操作,因为我正在修改变异 table。是否可以使用行触发器来完成此任务?
任何帮助将不胜感激。谢谢。
我认为您在更新员工之前忘记将新预算添加到当前预算总额中 table :
CREATE OR REPLACE TRIGGER update_budget
BEFORE INSERT on WorkOn
FOR EACH ROW
DECLARE
current_total_budget number;
project_budget number;
BEGIN
SELECT SUM(Project.Budget) INTO current_total_budget
FROM WorkOn
INNER JOIN Project
ON WorkOn.P# = Project.P#
WHERE E# = :NEW.E#;
SELECT Project.Budget INTO project_budget
FROM Project
WHERE P# = :NEW.P#;
current_total_budget := current_total_budget + project_budget;
UPDATE Employee
SET Total_Budget = current_total_budget WHERE E# = :NEW.E#;
END;
您收到变异 table 错误,因为您是 select 来自要插入到触发器体内的 table。您应该可以使用复合触发器实现您想要的。 Steven feuerstein 写了一篇很棒的文章 blog 解释了如何使用触发器解决此类问题。