我的更新前触发器未创建任何将空值更改为任何其他值的历史记录。它正在创建更改任何其他值的历史记录。 我的主要逻辑是这样的:
if nvl(:old.place,null) <> nvl(:new.place,null) then
insert into table (place)
values(:old.place)
end if;
答案 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