2016-04-19 3 views
0

J'écris un trigger dans lequel je dois insérer une valeur dans la table track si la valeur change dans le tableau parent_key. Je dois vérifier si la valeur est nulle puis la définir vide sinon l'ancienne valeur et la même chose que je dois faire pour la nouvelle valeur. J'ai essayé l'instruction case ci-dessous, mais ne l'insère pas dans la table de suivi si l'ancienne/nouvelle valeur initiale est null.cas où null puis vide dans l'instruction d'insertion 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; 

Répondre

2

Oracle, une chaîne vide '' est exactement la même que null.

Vous pouvez changer votre IF à ce qui suit:

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

Puisque vous ne pouvez pas comparer null = null

+0

mais pourquoi ai-je besoin de changer dans l'instruction IF? Parce que dans l'instruction if je dois vérifier seulement l'ancienne valeur non égal à la nouvelle valeur alors il ira dans le cas où l'instruction – Andrew

+0

je l'ai expliqué plus loin. Fondamentalement, vous ne pouvez pas comparer 'NULL = NULL', vous pouvez faire' NULL IS NULL' ou ''literal' = 'literal'', mais pas' NULL =' literal'' ou 'NULL = NULL'. Rechercher des comparaisons nulles dans SQL, – gmiley

1

la comparaison des deux null = null et not (null = null) résultats faux comme vous pouvez le voir par cette déclaration

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

donc vous devriez comparer null valeurs par l'opérateur is, dans votre cas

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  

le cas case when :old.track_name is null then '' else to_char(:old.track_name) end déclaration est inutile, parce que null et '' est le même. Que voulez-vous insérer en cas de valeur null?