В вашем коде есть куча ошибок:
- Каждый оператор должен заканчиваться
;
.(Во всех SQL-операторах отсутствует точка с запятой) - Первый оператор if не имеет
then
после условия. - Что делает часть
(select src.*, lead(doj) over (partition by ename order by doj)-1,
?Мне кажется, что это скопировано там непреднамеренно. ELSE IF
должно быть ELSIF
. - Переменные связывания
src
и target
не будут поняты компилятором,Эти таблицы?Затем вам нужно перебрать данные, используя цикл FOR
или что-то в этом роде. - Не следует выбирать данные таблицы, по которой вы запускаете.Лучше работать только с данными вставленной записи (если это возможно).
Таким образом, окончательное утверждение может выглядеть примерно так:
create trigger updatetarget
after insert on src
REFERENCING NEW AS NEW OLD AS OLD
for each row
begin
insert into target (id, ename, COMP, valid)
VALUES (:NEW.id, :NEW.ename, :NEW.COMP, 'Y');
-- Don't know what the following should do exactly:
IF src.id = target.id and src.ename=target.ename and src.comp<>target.COMP
THEN
update target
set valid = 'N'
where doe is not NULL;
ELSIF src.id = target.id and src.ename=target.ename and src.comp=target.comp
then
DELETE target
WHERE ID < ( SELECT MAX(ID) FROM target t
WHERE t.ename =target.ename AND t.comp = target.comp
AND t.id = target.id);
end if;
end;
/