0
我更新前的触发器未创建任何将空值更改为任何其他值的历史记录。它正在创造改变任何其他价值观的历史。 我的主要逻辑是这样的:在更新触发器未创建空值历史记录之前
if nvl(:old.place,null) <> nvl(:new.place,null) then
insert into table (place)
values(:old.place)
end if;
我更新前的触发器未创建任何将空值更改为任何其他值的历史记录。它正在创造改变任何其他价值观的历史。 我的主要逻辑是这样的:在更新触发器未创建空值历史记录之前
if nvl(:old.place,null) <> nvl(:new.place,null) then
insert into table (place)
values(:old.place)
end if;
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
它现在正在工作。谢谢 – user4826005
你的问题是, 'any value'<> null'的比较总是为false,就像这样:''any value'= null'。你应该使用'IS NULL'进行空比较。 – mustaccio