• Oracle存储过程案例


    注意几点:

    • 时间比较:TO_CHAR(EnableTime, 'yyyy-mm-dd') =TO_CHAR(SYSDATE, 'yyyy-mm-dd')
    • 定义表:%rowtype  ,例子:   dormodel  DISABLEOPERATIONRECORD%rowtype;--记录表  
    • 第一表字段:%Type  ,例子: s_ipid   INSPECTIONPOINT.ID%Type;--巡查表ID
    • 计算天数:TO_NUMBER(TO_DATE(TO_CHAR(SYSDATE, 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')- TO_DATE(TO_CHAR('2022-04-19', 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss'))

    案例1:

    create or replace procedure IP_TASK is
      --声明变量
      cursor c_list is
       select id ipid
       from INSPECTIONPOINT i
        where (EnableTime is not null 
         or DisableTime  is not null )
         and deleted=0
         and (TO_CHAR(EnableTime, 'yyyy-mm-dd') =TO_CHAR(SYSDATE, 'yyyy-mm-dd')
          or TO_CHAR(DisableTime, 'yyyy-mm-dd') =TO_CHAR(SYSDATE, 'yyyy-mm-dd') );
       
      s_ipid   INSPECTIONPOINT.ID%Type;--巡查表ID
      s_msg       VARCHAR(200);--消息
      ipmodel  INSPECTIONPOINT%rowtype;--巡查表
      v_setcount  number(10);--需要执行行数
      dormodel  DISABLEOPERATIONRECORD%rowtype;--记录表
      v_dorcount  number(10);--记录需要执行行数
      s_disableheaven  number(10);--停用天数
          
    begin
          --查询巡查定时未执行数据
          --打开游标
          open c_list;
        
          --遍历游标
          Loop
            --赋值给变量
            FETCH c_list
              INTO s_ipid;
            --退出循环条件 (通过%NOTFOUND判断是否有值,有值执行操作,没有则退出循环)
            exit when c_list%NOTFOUND;
            
          select count(1) into v_setcount from INSPECTIONPOINT where DELETED=0 and ID=s_ipid   ;
          
          if v_setcount > 0 then
          --查询今天需要执行的数据
          --看这条数据,启用时间和停用时间是执行那个
            select * into ipmodel from INSPECTIONPOINT where DELETED=0 and ID=s_ipid   ;
          --停用时间不需要计算,1:添加操作记录,2修改巡查停用时间-清空
               if  TO_CHAR(ipmodel.DisableTime, 'yyyy-mm-dd') =TO_CHAR(SYSDATE, 'yyyy-mm-dd') then 
                 
               --添加操作记录
                 insert into DISABLEOPERATIONRECORD
                 (CREATEDUSER,CREATETIME, LINKID, TQTYPE, MODELTYPE, DISABLEHEAVEN, ISTIMING)
                 values
                 (ipmodel.LastOperateUser,
                  SYSDATE,
                  ipmodel.id,
                  1,
                  1,
                  0,
                  1);
               
               --清空时间
                  update INSPECTIONPOINT set DisableTime='',Status=2 where id=ipmodel.id;
                
                end if;
          --启用时间就需要,计算停用天数,1:添加操作记录,2修改巡查启用时间-清空
             if  TO_CHAR(ipmodel.EnableTime, 'yyyy-mm-dd') =TO_CHAR(SYSDATE, 'yyyy-mm-dd') then 
                 
             -- 计算天数
             --先看操作记录是否有停用记录 
             
             select count(1) into v_dorcount  from DISABLEOPERATIONRECORD where deleted=0 and  LinkId=ipmodel.id and TqType=1 ;
                   
                 --没有记录,就拿更新时间,更新时间没有,就拿创建时间
                 if  v_dorcount<=0 then   
                       --更新时间
                       if  ipmodel.UpdatedTime is not null then       
                         select TO_NUMBER(TO_DATE(TO_CHAR(SYSDATE, 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')- TO_DATE(TO_CHAR(ipmodel.UpdatedTime, 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')) into s_disableheaven from dual;
                       end if;
                       --创建时间
                       if  ipmodel.UpdatedTime is null then      
                         select TO_NUMBER(TO_DATE(TO_CHAR(SYSDATE, 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')- TO_DATE(TO_CHAR(ipmodel.CreateTime, 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')) into s_disableheaven from dual;
                       end if;
                end if;
                --存在记录
                if  v_dorcount>0 then      
                      select * into dormodel from  ( select * from DISABLEOPERATIONRECORD where deleted=0 and  LinkId=ipmodel.id and TqType=1  order by createtime desc ) where  rownum = 1;
                      
                      select TO_NUMBER(TO_DATE(TO_CHAR(SYSDATE, 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')- TO_DATE(TO_CHAR(dormodel.CreateTime, 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')) into s_disableheaven from dual;              
                end if;
                
               --添加操作记录
                 insert into DISABLEOPERATIONRECORD
                 (CREATEDUSER,CREATETIME, LINKID, TQTYPE, MODELTYPE, DISABLEHEAVEN, ISTIMING)
                 values
                 (ipmodel.LastOperateUser,
                  SYSDATE,
                  ipmodel.id,
                  0,
                  1,
                  s_disableheaven,
                  1);
               
               --清空时间
                  update INSPECTIONPOINT set EnableTime='',Status=1 where id=ipmodel.id;
                
                end if;
          
     
            end if;
            
          end loop;
        
          --关闭游标
          close c_list;
          COMMIT;
          s_msg := '定时执行日常巡查停启任务';
          DBMS_OUTPUT.PUT_LINE(s_msg || '成功' ||
                               to_char(CURRENT_DATE, 'yyyy-mm-dd'));
    
      --异常回滚
    exception
      when others then
        rollback;
        dbms_output.put_line(s_msg || '失败' ||
                             to_char(CURRENT_DATE, 'yyyy-mm-dd'));
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
    end IP_TASK;

    案例2:

    create or replace procedure EP_Task(e_tasktype in NUMBER) is
      --声明变量
      cursor c_list is
        select e.id EquipId, p.id projectid
      from EQUIP e
      join PROJECT p
        on e.projectid = p.id
     where e.status = 2
       and e.DELETED = 0 ;
    
      s_equipid   EQUIP.ID%Type;--设备ID
      s_projectid PROJECT.Id%Type;--项目ID
      s_emid      EQUIPMAINTENANCEDETAIL.Emid%Type;--新增维保主表ID
      s_escid     EQUIPSELFCHECKDETAIL.ESID%Type;--新增自检主表ID
      s_msg       VARCHAR(200);--消息
      v_tcount number(10);--维保次数
      v_sentcount number(10);--已发送维保次数
      v_escount   number(10);--自检行数
      v_sentescount  number(10);--已发送自检行数
      v_setcount  number(10);--频率行数
      emmodel  EQUIPFREQUENCYSET%rowtype;--频率表
      s_frequency number(10) ;--执行次数
      s_bl number(10) ;--循环
      
    begin
    
      case e_tasktype
        when 1 then
          --创建维保任务
          --打开游标
          open c_list;
        
          --遍历游标
          Loop
            --赋值给变量
            FETCH c_list
              INTO s_equipid, s_projectid;
            --退出循环条件 (通过%NOTFOUND判断是否有值,有值执行操作,没有则退出循环)
            exit when c_list%NOTFOUND;
            
          select count(1) into v_setcount from EQUIPFREQUENCYSET eps where DELETED=0 and EQUIPID=s_equipid and TYPE=2 and rownum = 1;
          
          if v_setcount>0 then
              select * into emmodel from EQUIPFREQUENCYSET eps where DELETED=0 and EQUIPID=s_equipid and TYPE=2 and rownum = 1;
          end if;
        
          --频率任务设置存在
          if v_setcount > 0 and emmodel.endtime>=SYSDATE and emmodel.begintime<=SYSDATE  then
                 --查看次数和已发送的次数比较  
                 select count(1) into v_sentcount from EQUIPMAINTENANCE where DELETED=0 and EQUIPID=s_equipid and PROJECTID=s_projectid and CREATETIME>=emmodel.begintime and CREATETIME<=emmodel.endtime;
                  if v_sentcount<emmodel.frequency then
                   s_frequency:=emmodel.frequency - v_sentcount;
                  end if;
          end if;
          
          if v_setcount <= 0 or emmodel.endtime<SYSDATE or emmodel.begintime>SYSDATE then
           --频率任务没有设置---频率任务设置过期了或者不在范围内-默认1月1次
               select count(1) into v_tcount from EQUIPMAINTENANCE where DELETED=0 and EQUIPID=s_equipid and PROJECTID=s_projectid and CREATETIME>=trunc(sysdate, 'mm') ;
               if v_tcount<=0 then
               s_frequency:=1;
                end if;
           end if;
          
            s_bl:=0;
           
            while s_bl < s_frequency loop  s_bl:=s_bl+1;
              
             --新增主表
            insert into EQUIPMAINTENANCE
              (CREATEDUSER,CREATETIME, EQUIPID, PROJECTID, BEGINTIME, ENDTIME, STATUS)
            values
              (1,
              SYSDATE,
               s_equipid,
               s_projectid,
               (trunc(sysdate, 'mm')+1/24),
               (trunc(LAST_DAY(SYSDATE))+23/24),
               1);
            select "SEQ_EQUIPMAINTENANCE".currval into s_emid from dual;
             
          for ep_row in ( select ep.id EPId  from EquipPoint ep  join POINTBASIS pb on ep.PointId=pb.id where ep.equipid=s_equipid and ep.Status=0 and ep.DELETED=0 and  pb.PointNo != 20 and pb.PointNo != 21 )loop 
             
             --新增详情
            insert into EQUIPMAINTENANCEDETAIL
              (CREATEDUSER,CREATETIME, EMID, EPID)
            values
              (1,
              to_timestamp(TO_CHAR(sys_extract_utc(systimestamp),'YYYY-MM-DD') || ' 00:00:00','yyyy-mm-dd hh24:mi:ss.ff'), 
               s_emid,
               ep_row.epid
               );
             
             end loop;
          
        
            end loop;
          end loop;
        
          --关闭游标
          close c_list;
          COMMIT;
          s_msg := '定时创建维保任务';
          DBMS_OUTPUT.PUT_LINE(s_msg || '成功' ||
                               to_char(CURRENT_DATE, 'yyyy-mm-dd'));
        when 2 then
          --创建自检任务
          --打开游标
          open c_list;
        
          --遍历游标
          Loop
            --赋值给变量
            FETCH c_list
              INTO s_equipid, s_projectid;
            --退出循环条件 (通过%NOTFOUND判断是否有值,有值执行操作,没有则退出循环)
            exit when c_list%NOTFOUND;
          
              select count(1) into v_setcount from EQUIPFREQUENCYSET eps where DELETED=0 and EQUIPID=s_equipid and TYPE=1 and rownum = 1;
          
          if v_setcount>0 then
              select * into emmodel from EQUIPFREQUENCYSET eps where DELETED=0 and EQUIPID=s_equipid and TYPE=1 and rownum = 1;
          end if;
        
          --频率任务设置存在
          if v_setcount > 0 and emmodel.endtime>=SYSDATE and emmodel.begintime<=SYSDATE  then
                 --查看次数和已发送的次数比较  
                 select count(1) into v_sentescount from EQUIPSELFCHECK where DELETED=0 and EQUIPID=s_equipid and PROJECTID=s_projectid
                  and CREATETIME>=emmodel.begintime and CREATETIME<=emmodel.endtime and TYPE=1;
                  if v_sentescount<emmodel.frequency then
                   s_frequency:=emmodel.frequency - v_sentescount;
                  end if;
          end if;
          
          if v_setcount <= 0 or emmodel.endtime<SYSDATE or emmodel.begintime>SYSDATE then
           --频率任务没有设置---频率任务设置过期了或者不在范围内-默认1月1次
               select count(1) into v_escount from EQUIPSELFCHECK where DELETED=0 and EQUIPID=s_equipid and PROJECTID=s_projectid and CREATETIME>=trunc(sysdate, 'mm')and TYPE=1 ;
               if v_tcount<=0 then
               s_frequency:=1;
                end if;
           end if;
          
            s_bl:=0;
            
            while s_bl < s_frequency loop  s_bl:=s_bl+1;
                      --新增主表
            insert into EQUIPSELFCHECK
              (CREATEDUSER,
              CREATETIME,
               EQUIPID,
               PROJECTID,
               BEGINTIME,
               ENDTIME,
               TYPE,
               STATUS)
            values
              (1,
               SYSDATE,
               s_equipid,
               s_projectid,
               (trunc(sysdate, 'mm')+1/24),
               (trunc(LAST_DAY(SYSDATE))+23/24),
               1,
               1);
            select "SEQ_EQUIPSELFCHECK".currval into s_escid from dual;
           
            for ep_row in ( select ep.id EPId  from EquipPoint ep  join POINTBASIS pb on ep.PointId=pb.id where ep.equipid=s_equipid and ep.Status=0 and ep.DELETED=0 and pb.ISSELFCHECK=1 )loop 
                
               --新增详情
                insert into EQUIPSELFCHECKDETAIL
                    (CREATEDUSER,CREATETIME, ESID, EPID, SEVERITY, ELIGIBILITY)
                    values
                    (1,
                    to_timestamp(TO_CHAR(sys_extract_utc(systimestamp),'YYYY-MM-DD') || ' 00:00:00','yyyy-mm-dd hh24:mi:ss.ff'), 
                    s_escid,
                    ep_row.epid,
                    1,
                    1
                    );
              
              end loop;
              
            end loop;
          end loop;
        
          --关闭游标
          close c_list;
        
          COMMIT;
          s_msg := '定时创建自检任务';
          DBMS_OUTPUT.PUT_LINE(s_msg || '成功' ||
                               to_char(CURRENT_DATE, 'yyyy-mm-dd'));
        else
          null;
      end case;
      --异常回滚
    exception
      when others then
        rollback;
        dbms_output.put_line(s_msg || '失败' ||
                             to_char(CURRENT_DATE, 'yyyy-mm-dd'));
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
    end EP_Task;
  • 相关阅读:
    centos 安装tomcat
    UTF8 的BOM带来的麻烦
    linux 下tomcat开机自启动
    proxool连接池空闲连接中断问题解决
    java判断字符串是否为空的方法总结
    修改my.cnf ,使mysql 的表面不区分大小写
    csc a Wx.NET app.doc
    用Wiz作为灵格斯词典(Lingoes)的生词本
    单词
    使用OKHTTP方式发送POST请求,获取返回的JSON串
  • 原文地址:https://www.cnblogs.com/yueyongsheng/p/16164028.html
Copyright © 2020-2023  润新知