2016-04-19 5 views
0

値がparent_keyのテーブルに変更された場合は、trackテーブルに値を挿入する必要があります。私は値がnullであるかどうかをチェックしなければならず、それ以外の場合は古い値を空にし、同じ値を新しい値に対して行う必要があります。私は、以下のcase文を試しましたが、最初の古い値または新しい値がnullの場合、トラックテーブルに挿入しません。 Oracleでケースがnullの場合、oracleが挿入されていません。

create or replace TRIGGER parent_key_trg AFTER UPDATE ON parent_key 
    FOR EACH ROW 

BEGIN 

IF NOT :old.track_name=:new.track_name THEN 
    INSERT INTO track (TRACK_OLD_VALUE,TRACK_NEW_VALUE) 
    VALUES (case when :old.track_name is null then '' else to_char(:old.track_name) end,case when :new.track_name is null then '' else to_char(:new.track_name) end); 
    END IF; 

END; 

答えて

2

、空の文字列''nullと全く同じです。あなたはnull = null

+0

なぜIF文を変更する必要がありますか? if文では、新しい値に等しくない古い値だけをチェックしなければならないので、文 – Andrew

+0

をさらに説明した場合にはそれが入ります。基本的に 'NULL = NULL'を比較することはできません。' NULL IS NULL'や '' literal '=' literal''を実行できますが、 'NULL = 'literal''や' NULL = NULL'では実行できません。 SQLでのNULL比較を参照し、 – gmiley

1

この文

select case 
     when null = null then 
      'eq' 
     when not (null = null) then 
      'not eq' 
     else 
      '?' 
     end 
    from dual; 
--> '?' 
で見ることができるように偽の両方 null = nullnot (null = null)結果の比較を比較することはできませんので

IF Nvl(:old.track_name, 'NULL') <> Nvl(:new.track_name, 'NULL') THEN 

あなたのIF以下に変更することができます

したがって、あなたはを比較する必要がありますnull''が同じであるため、isオペレータによる0の値は、あなたのケース

IF :old.track_name <> :new.track_name 
OR :old.track_name is null and :new.track_name is not null 
OR :old.track_name is not null and :new.track_name is null THEN  

にcase文case when :old.track_name is null then '' else to_char(:old.track_name) endは、不要です。 null値の場合は、何を挿入しますか?

関連する問題