编译失败,PLS-00103 pl / sql

时间:2018-12-12 22:08:53

标签: sql plsql

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”以继续。

2 个答案:

答案 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