我正在编写触发器,如果track
表中的值发生变化,我必须在parent_key
表中插入值。我必须检查值是否为null然后将其设置为空,否则旧值和我必须为新值做同样的事情。我尝试了以下case语句,但如果初始旧/新值为null,则不会插入到track表中。
create or replace TRIGGER parent_key_trg AFTER UPDATE ON parent_key
FOR EACH ROW
BEGIN
IF NOT :old.track_name=:new.track_name THEN
INSERT INTO track (TRACK_OLD_VALUE,TRACK_NEW_VALUE)
VALUES (case when :old.track_name is null then '' else to_char(:old.track_name) end,case when :new.track_name is null then '' else to_char(:new.track_name) end);
END IF;
END;
答案 0 :(得分:2)
在oracle中,空字符串''
与null
完全相同。
您可以将IF
更改为以下内容:
IF Nvl(:old.track_name, 'NULL') <> Nvl(:new.track_name, 'NULL') THEN
由于您无法比较null = null
答案 1 :(得分:1)
null = null
和not (null = null)
结果的比较结果为false,您可以通过此声明看到
select case
when null = null then
'eq'
when not (null = null) then
'not eq'
else
'?'
end
from dual;
--> '?'
因此,您应该按null
运算符比较is
值
IF :old.track_name <> :new.track_name
OR :old.track_name is null and :new.track_name is not null
OR :old.track_name is not null and :new.track_name is null THEN
案例陈述case when :old.track_name is null then '' else to_char(:old.track_name) end
是不必要的,因为null
和''
是相同的。如果null
值,您想要插入什么?