我正在嘗試在表 (TABLE_1) 上創建一個觸發器,該觸發器檢測列 (ENTERED_DATE) 是否已更改,然后更新另一個表 (TABLE_2) 以將列 (ENTRY_DATE) 設定為 TABLE_1 上新更改的日期。
這是我所擁有的:
create or replace trigger TRG_NAME
after insert or update or delete on TABLE_1
for each row
begin
if updating then
if nvl(:old.ENTERED_DATE, '*') != nvl(:new.ENTERED_DATE, '*') then
update TABLE_2 set ENTRY_DATE = :new.ENTERED_DATE where ID = :old.ID;
end if;
end if;
end TRG_NAME;
/
觸發器編譯成功,但是當我更新兩個表上日期型別的列值時,出現以下錯誤:
ORA-01858: a non-numeric character was found where a numeric was expected
我很困惑,因為兩個表上的兩個欄位都是 DATE 資料型別,所以為什么會出現此錯誤?
uj5u.com熱心網友回復:
問題出在您nvl的 s 中:
if nvl(:old.ENTERED_DATE, '*') != nvl(:new.ENTERED_DATE, '*') then ...
兩個運算式都nvl需要重新調整相同的資料型別;否則,如果一個值不是null而另一個是,您最終會將字串'*'與日期進行比較 - 不允許此操作。
我了解您正在尋找空值比較;在標準 SQL 中,我們將使用運算子IS DISTINCT FROM- 但 Oracle 不支持它。
如果您確定某個日期永遠不會出現在您的資料中,您可以執行以下操作:
nvl(:old.ENTERED_DATE, date '1990-01-01') != nvl(:new.ENTERED_DATE, date '1990-01-01')
否則,您需要列舉邏輯組合:
:old.ENTERED_DATE != :new.ENTERED_DATE
or (:old.ENTERED_DATE is null and :new.ENTERED_DATE is not null)
or (:new.ENTERED_DATE is null and :old.ENTERED_DATE is not null)
uj5u.com熱心網友回復:
另一種解決方案是結合使用LNNVLCOALESCE:
update TABLE_2 set ENTRY_DATE = :new.ENTERED_DATE
where ID = :old.ID
and LNNVL(:old.ENTERED_DATE = :new.ENTERED_DATE)
and coalesce(:old.ENTERED_DATE, :new.ENTERED_DATE) is not null;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/529011.html
標籤:sql甲骨文日期触发器
下一篇:如何在excel中自定義日期
