Oracle:無法更改此觸發器類的New值


今天做ERP維護和管理工作中遇到一個問題,當一個值發生變化時,指定內容的值需要發生變化,

1、若該值由0變成1時,系統不做任何改變;

2、若該值由1變成0時,系統根據實際需求,刪除或清空該類的小項內容。

如圖:

結合該需求,筆者了解了觸發器的原理和用途,選擇運用觸發器原理來解決這一需求。

一開始,筆者未了解清楚:new的使用范疇,因此在書寫觸發器時將其寫在after之后執行,編譯時報出了“無法更改此觸發器類的New值”異常,尋思未解,於是開始尋找原因。之后才知道After時:new值只有讀的權限,沒有寫的權限,而Before時:new有讀寫權限,因此將After改為Before,編譯成功!

SQL如下:

修改前:

create or replace trigger tri_app1_mstr_upd after update on app1_mstr
for each row
begin
  if updating then
    if :new.app_hardware = 0 and :old.app_hardware = 1 then
      :new.app_1_dept      := '';
      :new.app_1_mgr1      := '';
      :new.app_1_summary   := '';
      :new.app_1_engineer1 := '';
      :new.app_1_engineer2 := '';
      :new.app_1_engineer3 := '';
      
      delete from appd6_det where appd6_flow = :old.app_flow;
    end if;        
  end if; 
end tri_app1_mstr_upd;
View Code

修改后:

create or replace trigger tri_app1_mstr_upd before update on app1_mstr
for each row
begin
  if updating then
    if :new.app_hardware = 0 and :old.app_hardware = 1 then
      :new.app_1_dept      := '';
      :new.app_1_mgr1      := '';
      :new.app_1_summary   := '';
      :new.app_1_engineer1 := '';
      :new.app_1_engineer2 := '';
      :new.app_1_engineer3 := '';
      
      delete from appd6_det where appd6_flow = :old.app_flow;
    end if;
    
    if :new.app_structure = 0 and :old.app_structure = 1 then
      :new.app_2_dept       :='';
      :new.app_2_mgr1       :='';
      :new.app_2_summary    :='';
      :new.app_2_engineer1  :='';
      :new.app_2_engineer2  :='';
      :new.app_2_engineer3  :='';
      
      delete from appd7_det where appd7_flow = :old.app_flow;
    end if;
    
    if :new.app_software = 0 and :old.app_software = :old.app_flow then
      :new.app_3_dept       :='';
      :new.app_3_mgr1       :='';
      :new.app_3_summary    :='';
      :new.app_3_engineer1  :='';
      :new.app_3_engineer2  :='';
      :new.app_3_engineer3  :='';
      
      delete from appd8_det where appd8_flow = :old.app_flow;
    end if;
    
    if :new.app_other = 0 and :old.app_other = 1 then
      :new.app_4_dept       :='';
      :new.app_4_mgr1       :='';
      :new.app_4_summary    :='';
      :new.app_4_engineer1  :='';
      :new.app_4_engineer2  :='';
      :new.app_4_engineer3  :='';
      
      delete from appd9_det where appd9_flow = :old.app_flow;
    end if;
    
    if :new.app_module = 0 and :old.app_module = 1 then
      :new.app_5_dept       :='';
      :new.app_5_mgr1       :='';
      :new.app_5_summary    :='';
      :new.app_5_engineer1  :='';
      :new.app_5_engineer2  :='';
      :new.app_5_engineer3  :='';
      
      delete from appd12_det where appd12_flow = :old.app_flow;
    end if;    
  end if; 
end tri_app1_mstr_upd;
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM