2015-04-29 43 views
0

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

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

你的问题是, 'any value'<> null'的比较总是为false,就像这样:''any value'= null'。你应该使用'IS NULL'进行空比较。 – mustaccio

回答

0

The NVL() function使用代替空的替换值。你用null替换null,这是毫无意义的。然后你试图比较两个null值与(in)等号运算符,并且由于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 
+0

它现在正在工作。谢谢 – user4826005

相关问题