Триггер Oracle SQL с условным обновлением на основе информации в отдельной таблице

#sql #triggers #oracle-sqldeveloper #plsqldeveloper

#sql #триггеры #oracle-sqldeveloper #plsqldeveloper

Вопрос:

У меня есть две таблицы:

  • cost_bank (вот где я хочу триггер)
  • master_data (в этой таблице есть информация, которую мне нужно проверить)

Я хочу создать триггер «после вставки» cost_bank , который запускается, когда вновь вставленный cost_bank.work_code объект находится в master_data таблице с a master_data.charge_type = 'EX' . Если этот сценарий верен, я хочу, чтобы триггер обновлял только недавно добавленную строку (может указывать by ID ) cost_bank со значением из master_data.r_cost_center for 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;
  

Приветствуется любая информация

Ответ №1:

Если вы хотите изменить ту же таблицу, вам нужен триггер before insert:

 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;