`
dawuafang
  • 浏览: 1100838 次
文章分类
社区版块
存档分类
最新评论

oracle存储过程中游标的使用(包括带参数的游标)

 
阅读更多

最近因为项目需要要写存储过程,以前没咋写过,接触到是接触过,在软通的时候接触过,那是华为的项目那个几个存储过程很大很复杂,也很乱,注释也少,看了个大概。最近一个月,前后也写了七八个简单点的存储过程,也对存储过程有了一个简单的认识,其实也不是很难,多查资料,多实践。闲话不扯了,下面主要说一下游标的组合使用,记录下来即便以后长时间不用了忘记。

场景:有几张表,现在根据业务要求要处理表b中的数据,但先要安照一个标准来处理是吧,这个标准又在表a中,a表中的标准有不是一条,现在需要安照a表的标准吧b表的数据都处理一边。这个是业务。

思考:首先要安装a表来处理的话,是不是要循环a表中的数据来处理那?肯定的,那就要先先一个游标来控制a表循环了。接下来要根据a表的标准来分析b表的数据,那按照java的理解应该是在a表的循环中套一个循环来处理b表的数据,其实这里也是一样的,那就还需要一个游标来控制整个里层的循环了,到这就要考虑怎么来嵌套游标循环了,可以百度“oracle 嵌套游标的使用”看看,这里不记录那些了,由于业务需要b表的数据量有比较大,a表的某一个标准也只是b表中的一部分数据,就是说但嵌套循环的时候还需要a表的中那条记录的一些字段信息。这样嵌套的时候考虑的就要多一点了,最后我选择使用带参数的游标来实现,把需要的a表参数传入b表中。

具体例子:

create or replace procedure P_SBZL_BLDY is

     --定义变量
     v_xlbh SP_DATA_TQI.Xlbh%type;
     v_xingb SP_DATA_TQI.Xingb%type;
     v_qslc SP_DATA_TQI.tqilc%type;
     v_zzlc SP_DATA_TQI.tqilc%type;
    
     --定义“标准”的游标
     CURSOR bzs IS
        SELECT * from sp_dic_bldystandard b;
     ---定义要处理的具体数据的游标
      CURSOR sjs (vxlbh varchar2,vxingb varchar2,vqslc number,vzzlc number) IS
        select t.xlbh,t.xlm,t.xingb,t.xingbmc,t.tqisum,t.tqilc,t.dyid,p.rpcgs,p.ypcgs,p.cpcgs from SP_DATA_TQI t left join sp_sbzl_pcgs p on t.dyid = p.dyid 
          where t.tqilc > vqslc and t.tqilc<vzzlc and t.xlbh = vxlbh and t.xingb = vxingb and p.jcny = to_char(sysdate,'yyyy-mm') and to_char(t.jcrq,'yyyy-mm')= to_char(sysdate,'yyyy-mm');
              

begin
  
 --清除当月数据
  delete SP_SBZL_BLDYXX t where t.scny = to_char(sysdate,'yyyy-mm');
  commit;
  
  --循环标准
  for c in bzs loop
     begin
       v_xlbh := c.xlbh;
       v_xingb := c.xingb;
       v_qslc := c.qslc;
       v_zzlc := c.zzlc;
       
       --循环具体数据把相关参数传入
       for bhs in sjs(v_xlbh,v_xingb,v_qslc,v_zzlc) loop
          begin
            
          --一级
           if bhs.tqisum<c.tqii and (bhs.ypcgs<c.cari) and (bhs.cpcgs<c.czypci) and (bhs.rpcgs<c.tcypci) then
             insert into SP_SBZL_BLDYXX values ( S_COMM_PK.NEXTVAL,bhs.xlbh,bhs.xlm,bhs.xingb,bhs.xingbmc,bhs.tqilc,bhs.tqisum,bhs.dyid,to_char(sysdate,'yyyy-mm'),'Ⅰ',c.id);
             commit;
           -- 2级
           elsif bhs.tqisum>c.tqiii or (bhs.ypcgs>c.carii) or (bhs.cpcgs>c.czypcii) or (bhs.rpcgs>c.tcypcii) then
                 --dbms_output.put_line('2'); 
                insert into SP_SBZL_BLDYXX values ( S_COMM_PK.NEXTVAL,bhs.xlbh,bhs.xlm,bhs.xingb,bhs.xingbmc,bhs.tqilc,bhs.tqisum,bhs.dyid,to_char(sysdate,'yyyy-mm'),'Ⅱ',c.id);
               commit;
           --3级
           elsif ((bhs.ypcgs>c.cariii1) and ( bhs.ypcgs>c.pciii1)) 
                  or ((bhs.ypcgs>c.cariii2) and (bhs.tqisum>c.tqiiii1))
                  or (bhs.tqisum>c.tqiiii2 and ( bhs.cpcgs>c.pciii2 or  bhs.rpcgs>c.pciii2)) 
                  or (bhs.ypcgs>c.cariii3) then
                
                insert into SP_SBZL_BLDYXX values ( S_COMM_PK.NEXTVAL,bhs.xlbh,bhs.xlm,bhs.xingb,bhs.xingbmc,bhs.tqilc,bhs.tqisum,bhs.dyid,to_char(sysdate,'yyyy-mm'),'Ⅲ',c.id);
               commit;
               
            --4级
           elsif ( bhs.tqisum>c.tqiiv and (bhs.ypcgs>c.cariv1) and ( (bhs.cpcgs > c.czypciv) or (bhs.rpcgs > c.tcypciv) ) ) or (bhs.ypcgs>c.cariv2) then
                
                insert into SP_SBZL_BLDYXX values ( S_COMM_PK.NEXTVAL,bhs.xlbh,bhs.xlm,bhs.xingb,bhs.xingbmc,bhs.tqilc,bhs.tqisum,bhs.dyid,to_char(sysdate,'yyyy-mm'),'Ⅳ',c.id);
               commit;   
            end if;
           
           
           
          end;
          end loop;
      end;
  end loop;
  
/*   open cs;
  loop
     fetch cs into rec_test2.qslc, cur_test1;
       exit when cs%notfound;
    dbms_output.put_line(rec_test2.qslc); 
    loop
      fetch cur_test1 into rec_test1;
         exit when cur_test1%notfound;
       dbms_output.put_line(rec_test1.tqilc); 
    end loop;
  end loop;
    */
      
  /*for c in cs loop
    BEGIN
          cursor zs is  select * from SP_DATA_TQI t left join sp_sbzl_pcgs p on t.dyid = p.dyid where t.tqilc > c.qslc and t.tqilc<c.zzlc;
          
          for s in zs loop
            begin
              if s.tqiz<c.tqii then
                --i
                dbms_output.put_line('1'); 
              elsif s.tqiz > c.tqii then
                 dbms_output.put_line('2'); 
            end;  
    END;
  end loop;*/
  
end P_SBZL_BLDY;

游标的一些具体写法我就不记录了,这里的目的主要是以后遇到这类需要可以这样来实现。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics