Оператор SQL игнорируется в триггере? - PullRequest
0 голосов
/ 24 сентября 2019

Я получаю сообщение об ошибке в своем коде триггера

Ошибки: TRIGGER UPDATETARGET
Строка / столбец: 2/1 PL / SQL: оператор SQL игнорируется
Строка / столбец: 3/ 9 PL / SQL: ORA-00933: команда SQL неправильно завершена

Я пытаюсь этот код на Oracle live SQL:

create trigger updatetarget
after insert on src
for each row
     begin
insert into target select * from src
    if
src.id = target.id and src.ename=target.ename and src.comp<>target.comp
update target set (select  src.*, lead(doj) over (partition by ename order by doj)-1,valid = 'N' where doe is not null
else if
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;
/

Просто хочу удалить эту ошибку.

1 Ответ

2 голосов
/ 24 сентября 2019

В вашем коде есть куча ошибок:

  • Каждый оператор должен заканчиваться ;.(Во всех 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;
/
...