PL / SQL if语句在触发器中被忽略

时间:2014-06-10 15:43:20

标签: sql oracle plsql

我尝试在其中一个字段为空或使用以下代码为null时在插入或更新触发器中抛出异常:

if :new.reactietekst = null or :new.reactietekst = '' then 
  raise invalid_text; 
end if;

但是当我尝试使用reactietekst字段的空值或空值进行插入时,代码似乎被忽略了。我的触发器中的其他异常工作正常。

测试插页:

insert into Reactie values (5,'Jan Janssen',to_date('21-12-2011','dd-mm-yyyy'),'89.98.10.12',null, 'NIEUW', 1); 
insert into Reactie values (5,'Jan Janssen',to_date('21-12-2011','dd-mm-yyyy'),'89.98.10.12','', 'NIEUW', 1); 

完整触发码:

create or replace trigger check_reactie
before update or insert
on REACTIE
for each row
declare
  invalid_capitals EXCEPTION;
  invalid_ip exception;
  invalid_text exception;
begin
  if isdutchip(:new.ipadres) = false then 
    raise invalid_ip;
  end if;
  if :new.reactietekst = null or :new.reactietekst = '' then 
    raise invalid_text; 
  end if;
  if :new.naam != initcap(:new.naam) then
    raise invalid_capitals;
  end if;
  if inserting then
    :new.status := 'NIEUW';
  end if;
EXCEPTION
  WHEN invalid_capitals THEN
    DBMS_OUTPUT.PUT_LINE('Alle woorden in de naam moeten met hoofdletter beginnen!');
  WHEN invalid_ip THEN
    DBMS_OUTPUT.PUT_LINE('Reacties mogen alleen vanaf een nederlands ip adress worden geplaats!');
  WHEN invalid_text THEN
    DBMS_OUTPUT.PUT_LINE('Reactie moet tekst bevatten!');
end;
/

1 个答案:

答案 0 :(得分:6)

在Oracle中,NULL和空字符串是相同的。在SQL中,您无法使用NULL=进行比较。只是做:

if :new.reactietekst is null then 
  raise invalid_text; 
end if;