更新触发器之前未创建空值的历史记录

时间:2015-04-29 14:14:49

标签: oracle

我的更新前触发器未创建任何将空值更改为任何其他值的历史记录。它正在创建更改任何其他值的历史记录。 我的主要逻辑是这样的:

if nvl(:old.place,null) <> nvl(:new.place,null) then
    insert into table (place)
    values(:old.place)
end if;

1 个答案:

答案 0 :(得分:0)

The NVL() function用于替换值代替null。你用null替换null,这是没有意义的。然后,您尝试将两个空值与(in)相等运算符进行比较,并且由于null既不等于或不等于包含其自身的任何内容,结果也是未知的,如果旧的或新的,您的条件始终为false value为null。

您可以使用您知道永远不会实际退出的固定虚拟值:

if nvl(:old.place,'**fake**') <> nvl(:new.place,'**fake**') then

但为了清楚起见,我通常更愿意明确测试空值:

if (:old.place is null and :new.place is not null)
  or (:old.place is not null and :new.place is null)
  or (:old.place != :new.place) then