一个Oracle触发器的示例

本文介绍了一个用于跟踪工单状态变化并更新相应计划状态的数据库触发器。该触发器在工单状态发生变化时被激活,并根据不同的状态转换条件更新计划的状态。
CREATE OR REPLACE TRIGGER WoStateChange AFTER UPDATE on csdbuser.T_PD_WorkOrder
for each row

  declare
  para_PlanState csdbuser.t_pd_plan.planstate%type;
  para_WoRunCnt int;
BEGIN
  --计划状态
  select PlanState into para_PlanState from T_PD_Plan where PlanID=:new.planid;

  --1 工单: 锁定1 -> 下载完毕2
  if(:old.wostate='1' and :new.wostate='2') then
     if(para_PlanState='1') then
        --计划状态由 制定1 变为 下载3
        update T_PD_Plan SET PlanState='3' where PlanID=:new.planid;
      end if;
  --2 工单: 下载完毕2 -> 执行3
  elsif (:old.wostate='2' and :new.wostate='3') then
     if(para_PlanState='3') then
      --计划状态由 下载3 变为 执行4
      update T_PD_Plan SET PlanState='4',FactStartTime=sysdate where PlanID=:new.planid;
    end if;
  --3 工单: 执行3 -> 完成4
  elsif (:old.wostate='3' and :new.wostate='4') then
    select COUNT(*) into para_WoRunCnt from T_PD_WorkOrder where PlanID=:new.planid and (WOState='1' or WOState='2' or WOState='3');
    --计划状态由 执行4 变为 完成5
    if(para_PlanState='4' and para_WoRunCnt=0) then
      update T_PD_Plan SET PlanState='5',FactEndTime=sysdate where PlanID=:new.planid;
    end if;
  --4 工单: 锁定1或下载完成2 -> 废弃5
  elsif((:old.wostate='1' or :old.wostate='2') and :new.wostate='5') then
    select COUNT(*) into para_WoRunCnt from T_PD_WorkOrder where PlanID=:new.planid and (WOState='1' or WOState='2' or WOState='3');
     if(para_PlanState='4' and para_WoRunCnt=0) then
      --计划状态由 执行4 变为 完成5
      update T_PD_Plan SET PlanState='5',FactEndTime=sysdate where PlanID=:new.planid;
    end if;
  --5 工单: 下载完成2 -> 锁定1
  elsif(:old.wostate='2' and :new.wostate='1') then
    --获取工单 执行 或 完成 的数量
    select COUNT(*) into para_WoRunCnt from T_PD_WorkOrder where PlanID=:new.planid and (WOState='3' or WOState='4');
     if(para_WoRunCnt=0) then
      --计划没有对应执行或完成的工单,清空计划开始和结束时间
      update T_PD_Plan SET PlanState='3',FactStartTime=null,FactEndTime=null where PlanID=:new.planid;
    end if;
    --获取工单 执行 或 完成 的数量
    select COUNT(*) into para_WoRunCnt from T_PD_WorkOrder where PlanID=:new.planid and (WOState='3' or WOState='4' or WOState='2');
    if(para_WoRunCnt=0) then
      --没有 下载完毕2,运行3,完成4 的工单,计划变为 制定1状态
      update T_PD_Plan SET PlanState='1' where PlanID=:new.planid;
    end if;
  end if;
END WoStateChange;

  

转载于:https://www.cnblogs.com/gsk99/p/4763428.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值