【问题标题】:Oracle SQL Trigger with Conditional Update based on Information in Separate Table基于单独表中的信息进行条件更新的 Oracle SQL 触发器
【发布时间】:2017-02-08 08:22:48
【问题描述】:
我有两张桌子:
-
cost_bank(这是我想要触发的地方)
-
master_data(此表有我需要检查的信息)
我想在cost_bank 上构建一个“插入后”触发器,该触发器在新插入的cost_bank.work_code 位于master_data 表中且带有master_data.charge_type = 'EX' 时运行。如果这种情况属实,我希望触发器仅更新cost_bank 中新添加的行(可以由ID 指定),其值来自master_data.r_cost_center 的cost_bank.cost_center。
这是我目前所拥有的:
CREATE OR REPLACE TRIGGER expense_charge_cost_center
AFTER INSERT ON cost_bank FOR EACH ROW
WHEN (new.work_code in (select work_code from master_data where charge_type = 'EX'))
BEGIN
update cost_bank set cost_center = (select r_cost_center
from master_data where work_code = new.work_code) where id = new.id;
END;
感谢任何见解
【问题讨论】:
标签:
sql
triggers
oracle-sqldeveloper
plsqldeveloper
【解决方案1】:
如果你想修改同一张表,你需要一个before插入触发器:
CREATE OR REPLACE TRIGGER expense_charge_cost_center
BEFORE INSERT ON cost_bank FOR EACH ROW
WHEN (new.work_code in (select work_code from master_data where charge_type = 'EX'))
BEGIN
select r_cost_center into :new.cost_center
from master_data
where work_code = new.work_code;
END;
实际上,我不确定子查询是否适用于when,因此您可能需要:
CREATE OR REPLACE TRIGGER expense_charge_cost_center
BEFORE INSERT ON cost_bank FOR EACH ROW
BEGIN
if (new.work_code in (select work_code from master_data where charge_type = 'EX')) then
select r_cost_center into :new.cost_center
from master_data
where work_code = new.work_code; -- I'm guessing you also want charge_type = 'EX'
end if;
END;