【问题标题】: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_centercost_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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多