2016-02-20 2 views
0

Я пишу один триггер, который будет запускаться при обновлении и вставлять на один стол и вставлять в другую таблицу. Триггер выглядит так.Триггер не запускается с использованием ссылки

create or replace trigger update_test_history 
    before insert or update on demo.test_req REFERENCING NEW AS NEW OLD AS old 
    for each row 
declare 
    v_count number(1); 
begin 

    if :old.quote_request_id != null then 
     --Update History table 
     insert into demo.test_req_history 
     (history_id, 
      req_id) 
     values 
     (isisdba.req_hist_seq.nextval, 
      :old.req_id); 
     end if; 

end update_test_history; 

Этот триггер не работает с DML. Но если я удалю условие if, тогда он начнет работать. Может кто-нибудь, пожалуйста, скажите мне, что случилось с этим. Спасибо заранее.

+0

Определить «не работает»? 'null' никогда не равен никакому значению, включая' null'. 'null' также никогда не отличается от другого значения, включая' null'. Поэтому 'something! = Null' никогда не будет оцениваться как' true'. Возможно, вы хотите ': old.quote_request_id не null '. –

+0

Спасибо, Ястин, работает. –

ответ

1

null не имеет ценности, включая null. null также не может быть неравным с другим значением, включая null. Поэтому заявление

if(<<some expression>> != null) 
then 
    <<do something>> 
end if; 

никогда не войдет в блок <<do something>>. Ни будет

if(<<some expression>> = null) 
then 
    <<do something>> 
end if; 

Вы должны использовать троичной логики, где вы имеете дело с null значений бушель говоря is null или is not null. Похоже, что вы, вероятно, хотите

if(:old.quote_request_id is not null) 
the 
    <<do something>> 
end if;