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

Epi*_*Sam 0 sql oracle plsql

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

if :new.reactietekst = null or :new.reactietekst = '' then 
  raise invalid_text; 
end if;
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用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); 
Run Code Online (Sandbox Code Playgroud)

完整触发代码:

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;
/
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 6

在Oracle中,NULL空字符串是相同的.在SQL中,您无法与NULL使用进行比较=.做就是了:

if :new.reactietekst is null then 
  raise invalid_text; 
end if;
Run Code Online (Sandbox Code Playgroud)