#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;