2016-04-19 24 views
0

Ich schreibe Trigger, in dem ich Wert in track Tabelle einfügen muss, wenn Wert in parent_key Tabelle ändert. Ich muss prüfen, ob der Wert Null ist, dann setze ich ihn leer, sonst den alten Wert und dasselbe, was ich für einen neuen Wert tun muss. Ich habe die folgende case-Anweisung ausprobiert, sie wird jedoch nicht in die Verweistabelle eingefügt, wenn der ursprüngliche alte/neue Wert null ist.Fall, wenn null, dann leer in Oracle einfügen Anweisung

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; 

Antwort

2

In Orakel, ein leerer String '' ist genau die gleiche wie null.

Sie könnten Ihre IF wie folgt ändern:

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

Da Sie nicht null = null

+0

aber warum muss ich in IF-Anweisung ändern? Weil ich in if-Anweisung nur den alten Wert überprüfen muss, der nicht gleich dem neuen Wert ist, dann wird es in dem Fall gehen, wenn die Anweisung – Andrew

+0

Ich habe es weiter erklärt. Im Grunde können Sie 'NULL = NULL' nicht vergleichen, Sie können' NULL IS NULL' oder ''Literal' = 'Literal'', aber nicht' NULL =' Literal'' oder 'NULL = NULL'. Nachschlagen Null Vergleiche in SQL, – gmiley

1

der Vergleich beider null = null und not (null = null) Ergebnisse falsch, wie Sie durch diese Aussage sehen

select case 
     when null = null then 
      'eq' 
     when not (null = null) then 
      'not eq' 
     else 
      '?' 
     end 
    from dual; 
--> '?' 
vergleichen

daher sollten Sievergleichen 0 Werte von is Operator, in Ihrem Fall

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  

der Fall Aussage case when :old.track_name is null then '' else to_char(:old.track_name) end ist unnötig, weil null und '' gleich ist. Was möchten Sie im Fall von null Wert einfügen?