无法在Apex Oracle SQL / PL PLS-00103中编译触发器

时间:2018-12-13 00:00:07

标签: sql oracle plsql oracle-apex

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 := NULL and :new.datumterugbetaald := NOT NULL then
    :new.terugbetaald := 'Y'
end if;

if :old.datumterugbetaald := NOT NULL and :new.datumterugbetaald := NULL then
    :new.terugbetaald := 'N'
end if;

end;

我无法编译它。我每次都会收到此错误:

PLS-00103: Encountered the symbol "=" when expecting one of the following: . ( * @ % & = - + < / > at in is mod remainder not rem then <an exponent (**)> <> or != or ~= >= <= <> and or like like2 like4 likec between || multiset member submultiset

对于最后两个if语句,它必须执行以下操作:

  • 当我填写datumterugbetaald时,必须将terugbetaald设置为Yes。
  • 如果我必须清除datumterugbetaald,必须将Terugbetaald设置为“否”。

1 个答案:

答案 0 :(得分:1)

最后两个if语句正在使用:=赋值运算符,而不是=等式运算符。 old引用之一也缺少其前导冒号,并且您缺少了几个语句结尾的分号。

但是您不能将空值与相等性检查进行比较,而必须使用there are dedicated operators

所以这些应该是:

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;

如果if都不为true,则还需要考虑将该列设置为什么-如果您要检查的列过去是并且保持为空,或者过去是并且保持不为零(包括它更改了值) )。

前三项检查也是如此;而且您的第一张和第三张支票似乎是相同的。