create or replace TRIGGER lening_bri
BEFORE
update on lening
for each row
begin
if :old.terugbetaald = 'N' and :new.terugbetaald = 'Y' then
:new.datumterugbetaald := sysdate;
end if;
if :old.terugbetaald = 'Y' and :new.terugbetaald = 'N' then
:new.datumterugbetaald := NULL;
end if;
if :old.terugbetaald = 'N' and :new.terugbetaald = 'Y' then
:new.datumterugbetaald := sysdate;
end if;
if old.datumterugbetaald IS NULL and :new.datumterugbetaald IS NOT NULL then
:new.terugbetaald := 'Y'
end if;
if :old.datumterugbetaald IS NOT NULL and :new.datumterugbetaald IS NULL then
:new.terugbetaald := 'N'
end if;
end;
每次我运行它时,都会遇到该编译错误
PLS-00103:在预期以下情况之一时遇到符号“ END”:*&=-+; />在in是mod余数,而不是rem <>或!=或〜=> = <= <>和||之间的like2 like4 likec multiset成员submultiset符号“;”被替换为“ END”以继续。编译失败,第23行(22:40:46)与编译错误关联的行号是相对于第一个BEGIN语句的。这仅影响数据库触发器的编译。 PLS-00103:预期以下其中一项时遇到符号“ END”:*&=-+; />在in是mod余数,而不是rem <>或!=或〜=> = <= <>和||之间的like2 like4 likec multiset成员submultiset符号“;”被替换为“ END”以继续。
答案 0 :(得分:0)
您有很多语法错误。检查以下解决方案:
create or replace TRIGGER lening_bri
BEFORE
update on lening
for each row
begin
if :old.terugbetaald = 'N' and :new.terugbetaald = 'Y' then
:new.datumterugbetaald := sysdate;
end if;
begin
if :old.terugbetaald = 'Y' and :new.terugbetaald = 'N' then
:new.datumterugbetaald := NULL;
end if;
begin
if :old.terugbetaald = 'N' and :new.terugbetaald = 'Y' then
:new.datumterugbetaald := sysdate;
end if;
begin
if :new.datumterugbetaald IS NOT NULL then
:new.terugbetaald := 'Y';
end if;
begin
if :new.datumterugbetaald IS NOT NULL then
:new.terugbetaald := 'N';
end if;
end;
答案 1 :(得分:0)
您有太多begin
个。它们不是if的一部分,而是触发器主体的一部分。如果缩进代码,您将看到应该如何。触发器的begin..end,条件触发器的if..end ifs。
此外,分配应使用:=
而不是=
。您在最后两对ifs中以及在终止这些语句的分号中都错过了这一点。
create or replace trigger lening_bri
before update on lening
for each row
begin
if :old.terugbetaald = 'N' and :new.terugbetaald = 'Y' then
:new.datumterugbetaald := sysdate;
end if;
if :old.terugbetaald = 'Y' and :new.terugbetaald = 'N' then
:new.datumterugbetaald := NULL;
end if;
if :old.terugbetaald = 'N' and :new.terugbetaald = 'Y' then
:new.datumterugbetaald := sysdate;
end if;
if :new.datumterugbetaald IS NOT NULL then
:new.terugbetaald := 'Y';
end if;
if :new.datumterugbetaald IS NOT NULL then
:new.terugbetaald := 'N';
end if;
end;
顺便说一句,您的代码让我有些困惑。似乎您希望能够设置标志terugbetaald(偿还),并在设置标志时填写日期(偿还日期),或者您接受要设置的日期,并相应地更新标志。对我来说有点双重。为什么不将标志设为计算的虚拟列?
第三个if与第一个if相同,并且最后一个if的条件相反,应该为:new.datumterugbetaald IS NULL
。