Oracle 觸發器 before insert update


  場景,往A表插入數據時,A表和B表是同一類型的狀態下,A表中累計的值,不能超過B表中的值(注:往數據庫插入時,不能批量執行事務!),利用觸發器before insert update,監控狀態,若超過B表中的值,拋異常

CREATE OR REPLACE TRIGGER "RATED_TIME_BUDGET_ITEM_TRG"
    before insert or update on Rated_time_budget_item
    for each row
      declare tmp_dw number; -- 詳設
      tmp_pw number; --生設
      tmp_gw number; --非圖
      sum_dw number; --合計詳設
      sum_pw number; --合計生設
      sum_gw number; --合計非圖
      pragma autonomous_transaction; --指定自定義事務類型,不加要不然update會報錯
    begin
      if :new.id is null then
      select Rated_time_budget_item_seq.Nextval into:new.id from dual;
      select DETIAL_WORKHOUR into tmp_dw from Rated_Time_Budget_Hdr where ID=:new.RATED_TIME_BUDGET_HDR_ID; --詳設工時
      select PRODU_WORKHOUR into tmp_pw from Rated_Time_Budget_Hdr where ID=:new.RATED_TIME_BUDGET_HDR_ID; --生設工時
      select GENERAL_WORKHOUR into tmp_gw from Rated_Time_Budget_Hdr where ID=:new.RATED_TIME_BUDGET_HDR_ID; --非圖工時
      if (:new.S_TYPE=0) then
        SELECT NVL(SUM(BUDGET_HOUR),0)+:new.BUDGET_HOUR INTO sum_dw FROM Rated_Time_Budget_ITEM WHERE RATED_TIME_BUDGET_HDR_ID=:new.RATED_TIME_BUDGET_HDR_ID AND S_TYPE=0; --合計詳設工時
      end if;
      if (:new.S_TYPE=1) then 
        SELECT NVL(SUM(BUDGET_HOUR),0)+:new.BUDGET_HOUR INTO sum_pw FROM Rated_Time_Budget_ITEM WHERE RATED_TIME_BUDGET_HDR_ID=:new.RATED_TIME_BUDGET_HDR_ID AND S_TYPE=1; --合計生設工時
      end if;
      if (:new.S_TYPE=4) then
        SELECT NVL(SUM(BUDGET_HOUR),0)+:new.BUDGET_HOUR INTO sum_gw FROM Rated_Time_Budget_ITEM WHERE RATED_TIME_BUDGET_HDR_ID=:new.RATED_TIME_BUDGET_HDR_ID AND S_TYPE=4; --合計非圖工時
      end if;
      if(sum_dw>tmp_dw) then
          RAISE_APPLICATION_ERROR(-20000,'新增-合計詳設工時:'||sum_dw||',超過:'||tmp_dw||'!');
      end if;
      if(sum_pw>tmp_pw) then
          RAISE_APPLICATION_ERROR(-20000,'新增-合計生設工時:'||sum_pw||',超過:'||tmp_pw||'!');
      end if;
      if(sum_gw>tmp_gw) then
          RAISE_APPLICATION_ERROR(-20000,'新增-合計非圖工時:'||sum_gw||',超過:'||tmp_gw||'!');
      end if;
     else
        select DETIAL_WORKHOUR into tmp_dw from Rated_Time_Budget_Hdr where ID=:old.RATED_TIME_BUDGET_HDR_ID; --詳設工時
        select PRODU_WORKHOUR into tmp_pw from Rated_Time_Budget_Hdr where ID=:old.RATED_TIME_BUDGET_HDR_ID; --生設工時
        select GENERAL_WORKHOUR into tmp_gw from Rated_Time_Budget_Hdr where ID=:old.RATED_TIME_BUDGET_HDR_ID; --非圖工時
        if (:old.S_TYPE=0) then
          SELECT NVL(SUM(BUDGET_HOUR),0)+:new.BUDGET_HOUR into sum_dw FROM Rated_Time_Budget_ITEM WHERE RATED_TIME_BUDGET_HDR_ID=:old.RATED_TIME_BUDGET_HDR_ID AND S_TYPE=0 AND ID!=:old.id; --合計詳設工時
        end if;
        if (:old.S_TYPE=1) then
          SELECT NVL(SUM(BUDGET_HOUR),0)+:new.BUDGET_HOUR into sum_pw FROM Rated_Time_Budget_ITEM WHERE RATED_TIME_BUDGET_HDR_ID=:old.RATED_TIME_BUDGET_HDR_ID AND S_TYPE=1 AND ID!=:old.id; --合計生設工時
        end if;
        if (:old.S_TYPE=4) then
          SELECT NVL(SUM(BUDGET_HOUR),0)+:new.BUDGET_HOUR into sum_gw FROM Rated_Time_Budget_ITEM WHERE RATED_TIME_BUDGET_HDR_ID=:old.RATED_TIME_BUDGET_HDR_ID AND S_TYPE=4 AND ID!=:old.id; --合計非圖工時
        end if;        
      if(sum_dw>tmp_dw) then
          RAISE_APPLICATION_ERROR(-20000,'修改-合計詳設工時:'||sum_dw||',超過:'||tmp_dw||'!');
      end if;
      if(sum_pw>tmp_pw) then
          RAISE_APPLICATION_ERROR(-20000,'修改-合計生設工時:'||sum_pw||',超過:'||tmp_pw||'!');
      end if;
      if(sum_gw>tmp_gw) then
          RAISE_APPLICATION_ERROR(-20000,'修改-合計非圖工時:'||sum_gw||',超過:'||tmp_gw||'!');
      end if;
    end if;
    commit; --提交事務
  end Rated_time_budget_item_trg;

 

create or replace trigger Rated_TYPE_TRI
   before
      insert or update on Rated_Time_Budget_WORK_TYPE
   for each row
declare tmp_wth number; -- 工時
   sum_wth number; --總工時
   pragma autonomous_transaction;
 begin
   if :new.id is null then
      SELECT Rated_TYPE_SEQ.Nextval  INTO :NEW.ID FROM DUAL;
      SELECT BUDGET_HOUR into tmp_wth FROM Rated_time_budget_item WHERE ID=:new.RATED_TIME_BUDGET_ITEM_ID; --工時
      SELECT NVL(SUM(WORK_TYPE_HOUR),0)+:new.WORK_TYPE_HOUR INTO sum_wth FROM Rated_Time_Budget_WORK_TYPE WHERE RATED_TIME_BUDGET_ITEM_ID=:new.RATED_TIME_BUDGET_ITEM_ID; --合計預算工時
     if(sum_wth>tmp_wth) then
          RAISE_APPLICATION_ERROR(-20000,'新增-合計預算工時:'||sum_wth||',超過:'||tmp_wth||'!');
      end if;
   else
     SELECT BUDGET_HOUR into tmp_wth FROM Rated_time_budget_item WHERE ID=:old.RATED_TIME_BUDGET_ITEM_ID; --工時
     SELECT NVL(SUM(WORK_TYPE_HOUR),0)+:new.WORK_TYPE_HOUR INTO sum_wth FROM Rated_Time_Budget_WORK_TYPE WHERE RATED_TIME_BUDGET_ITEM_ID=:old.RATED_TIME_BUDGET_ITEM_ID AND id!=:old.id; --合計預算工時
      if(sum_wth>tmp_wth) then
          RAISE_APPLICATION_ERROR(-20000,'修改-合計預算工時:'||sum_wth||',超過:'||tmp_wth||'!');
      end if;
   end if;
 end Rated_TYPE_TRI;

 


免責聲明!

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



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