`
viwo
  • 浏览: 219941 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

对于一个业务使用游标和使用临时表的两种实现

阅读更多
无疑在大数据量的情况下使用临时表版本的效率会远远高于使用游标版本。
使用游标版本:
sql 代码
  1.  cursor cur_swcode is  
  2.     select code as swcode, name as swname from swcode where flag = 3;   
  3. begin  
  4.   for rec_swcode in cur_swcode loop   
  5.     --DBMS_OUTPUT.put_line(rec_swcode.swcode||rec_swcode.swname);   
  6.      
  7.     --本期累计批准的核实调查条数   
  8.     select count(*)   
  9.       into vn_bqljpzdchsts   
  10.       from sh_unpass_sub   
  11.       left outer join sh_unpass on sh_unpass.MS_ID = sh_unpass_sub.MS_ID   
  12.       left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE   
  13.      where pz_date >= to_date(vs_start_day, 'yyyymmdd')   
  14.        and pz_date <= to_date(vs_end_day, 'yyyymmdd')   
  15.        and pz_flag = 'R'   
  16.        and cpcode.swcode = rec_swcode.swcode;   
  17.      
  18.     --上期批准上期未办结的调查核实条数   
  19.     select count(*)   
  20.       into vn_sqpzsqwbjdchsts   
  21.       from sh_unpass_sub   
  22.       left outer join sh_unpass on sh_unpass.MS_ID = sh_unpass_sub.MS_ID   
  23.       left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE   
  24.      where pz_date >= to_date(vs_ln_start_day, 'yyyymmdd')   
  25.        and pz_date <= to_date(vs_ln_end_day, 'yyyymmdd')   
  26.        and pz_flag = 'R'   
  27.        and jzhs_flag <> 'R'   
  28.        and cpcode.swcode = rec_swcode.swcode;   
  29.      
  30.       --期末未到期的调查核实数   
  31.     select count(*) into vn_qmwdqdchsts   
  32.     from sh_unpass_sub    
  33.     left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id    
  34.     left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE   
  35.     where pz_date >= to_date(vs_start_day, 'yyyymmdd')   
  36.     and pz_date <= to_date(vs_end_day, 'yyyymmdd')   
  37.     and pz_flag = 'R'    
  38.     and cpcode.swcode = rec_swcode.swcode   
  39.     and FLOOR(to_date(vs_end_day, 'yyyymmdd')-pz_date)   
  40.     <   
  41.     case sh_unpass_sub.hsjg   
  42.         when '3' then 69   
  43.     else  
  44.         case sh_unpass_sub.hsfs    
  45.             when '1' then 7    
  46.             when '2' then 36   
  47.             when '3' then 72    
  48.         end  
  49.     end;   
  50.        
  51.     --到期已审核无信息的调查核实条数   
  52.     select count(*) into vn_dqyshwxxdchsts   
  53.     from sh_unpass_sub    
  54.     left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id    
  55.     left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE   
  56.     where pz_date>=to_date(vs_start_day,'yyyymmdd')    
  57.     and pz_date<=to_date(vs_end_day,'yyyymmdd')    
  58.     and up_reason = '3'   
  59.     and pz_flag = 'R'    
  60.     and cpcode.swcode = rec_swcode.swcode ;   
  61.        
  62.     --到期未核实完结条数   
  63.     select count(*) into vn_dqwwjhsts   
  64.     from sh_unpass_sub    
  65.     left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id    
  66.     left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE   
  67.     where pz_date>=to_date(vs_start_day,'yyyymmdd')    
  68.     and pz_date<=to_date(vs_end_day,'yyyymmdd')    
  69.     and pz_flag = 'R'    
  70.     and jzhs_flag<>'R'   
  71.     and cpcode.swcode = rec_swcode.swcode   
  72.     and FLOOR(to_date(vs_end_day, 'yyyymmdd')-pz_date)   
  73.     >   
  74.     case sh_unpass_sub.hsjg   
  75.         when '3' then 69   
  76.     else  
  77.         case sh_unpass_sub.hsfs    
  78.             when '1' then 7    
  79.             when '2' then 36   
  80.             when '3' then 72    
  81.         else 7   
  82.         end  
  83.     end;   
  84.        
  85.     --到期超时核实完结条数   
  86.       select    
  87.       sum(   
  88.       floor   
  89.       (   
  90.       case sh_unpass_sub.hsjg    
  91.       when '3' then  
  92.        case    
  93.            when jzhs_date-pz_date>69   
  94.               then (jzhs_date-pz_date-69)/10+1   
  95.          else 0   
  96.        end      
  97.       else    
  98.         case sh_unpass_sub.hsfs    
  99.             when '1' then     
  100.                  case    
  101.                   when jzhs_date-pz_date>7    
  102.                    then (jzhs_date-pz_date-7)/7+1   
  103.                    else 0   
  104.                  end  
  105.             when '2' then    
  106.                   case    
  107.                   when jzhs_date-pz_date>36    
  108.                    then (jzhs_date-pz_date-36)/10+1   
  109.                    else 0   
  110.                  end  
  111.             when '3' then    
  112.                   case    
  113.                   when jzhs_date-pz_date>72    
  114.                    then (jzhs_date-pz_date-72)/10+1   
  115.                    else 0   
  116.                  end  
  117.             else 0   
  118.         end  
  119.       end  
  120.       )    
  121.       ) into vn_dqcshswjts   
  122.       from sh_unpass_sub    
  123.       left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id    
  124.       left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE   
  125.       where pz_date>=to_date(vs_start_day,'yyyymmdd')    
  126.       and pz_date<=to_date(vs_end_day,'yyyymmdd')    
  127.       and pz_flag = 'R'    
  128.       and jzhs_flag = 'R'   
  129.       and cpcode.swcode = rec_swcode.swcode;   
  130.   
  131.   end loop;  
不使用游标版本:
sql 代码
  1. insert into dchsjsltjb_tmp(swcode,swname,num1,num2,num3,num4,num5,num6)       
  2. select code,name,v1,v2,v3,v4,v5,v6 from swcode       
  3.      
  4. left outer join       
  5.   --本期累计批准的核实调查条数      
  6.   --insert into dchsjsltjb_tmp(swcode,num1)      
  7.   (      
  8.   select cpcode.swcode as swcode ,count(*) as v1      
  9.     --into vn_bqljpzdchsts      
  10.     from sh_unpass_sub      
  11.     left outer join sh_unpass on sh_unpass.MS_ID = sh_unpass_sub.MS_ID      
  12.     left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE      
  13.     --left outer join swcode on swcode.code = cpcode.swcode      
  14.    where pz_date >= to_date(vs_start_day, 'yyyymmdd')      
  15.      and pz_date <= to_date(vs_end_day, 'yyyymmdd')      
  16.      and pz_flag = 'R'      
  17.      group by swcode      
  18.      --and cpcode.swcode = rec_swcode.swcode;      
  19.    ) sel1 on sel1.swcode = swcode.code      
  20.          
  21.   left outer join       
  22.   (      
  23.   --上期批准上期未办结的调查核实条数      
  24.   --insert into dchsjsltjb_tmp(swcode,num2)       
  25.   select cpcode.swcode as swcode ,count(*) as v2      
  26.     --into vn_sqpzsqwbjdchsts      
  27.     from sh_unpass_sub      
  28.     left outer join sh_unpass on sh_unpass.MS_ID = sh_unpass_sub.MS_ID      
  29.     left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE      
  30.     --left outer join swcode on swcode.code = cpcode.swcode      
  31.    where pz_date >= to_date(vs_ln_start_day, 'yyyymmdd')      
  32.      and pz_date <= to_date(vs_ln_end_day, 'yyyymmdd')      
  33.      and pz_flag = 'R'      
  34.      and jzhs_flag <> 'R'      
  35.      group by swcode      
  36.      --and cpcode.swcode = rec_swcode.swcode;      
  37.    ) sel2 on sel2.swcode = swcode.code      
  38.          
  39.     --期末未到期的调查核实数      
  40.      
  41.   left outer join       
  42.   (      
  43.   --insert into dchsjsltjb_tmp(swcode,num3)       
  44.   select cpcode.swcode as swcode ,count(*) as v3      
  45.   --into vn_qmwdqdchsts      
  46.   from sh_unpass_sub       
  47.   left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id       
  48.   left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE      
  49.   --left outer join swcode on swcode.code = cpcode.swcode      
  50.   where pz_date >= to_date(vs_start_day, 'yyyymmdd')      
  51.   and pz_date <= to_date(vs_end_day, 'yyyymmdd')      
  52.   and pz_flag = 'R'       
  53.   --and cpcode.swcode = rec_swcode.swcode      
  54.   and FLOOR(to_date(vs_end_day, 'yyyymmdd')-pz_date)      
  55.   <      
  56.   case sh_unpass_sub.hsjg      
  57.     when '3' then 69      
  58.   else     
  59.     case sh_unpass_sub.hsfs       
  60.         when '1' then 7       
  61.         when '2' then 36      
  62.         when '3' then 72       
  63.       else 7      
  64.     end     
  65.   end     
  66.    group by swcode      
  67.    ) sel3 on sel3.swcode = swcode.code      
  68.      
  69.   --到期已审核无信息的调查核实条数      
  70.      
  71.   left outer join       
  72.   (      
  73.   --insert into dchsjsltjb_tmp(swcode,num4)       
  74.   select cpcode.swcode as swcode ,count(*) as v4      
  75.   --into vn_dqyshwxxdchsts      
  76.   from sh_unpass_sub       
  77.   left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id       
  78.   left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE      
  79.   --left outer join swcode on swcode.code = cpcode.swcode      
  80.   where pz_date>=to_date(vs_start_day,'yyyymmdd')       
  81.   and pz_date<=to_date(vs_end_day,'yyyymmdd')       
  82.   and up_reason = '3'      
  83.   and pz_flag = 'R'       
  84.   --and cpcode.swcode = rec_swcode.swcode ;      
  85.   group by swcode      
  86.    ) sel4 on sel4.swcode = swcode.code      
  87.      
  88.      
  89.   --到期未核实完结条数      
  90.    left outer join       
  91.   (      
  92.   --insert into dchsjsltjb_tmp(swcode,num5)       
  93.   select cpcode.swcode as swcode ,count(*) as v5      
  94.   --into vn_dqwwjhsts      
  95.   from sh_unpass_sub       
  96.   left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id       
  97.   left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE      
  98.   --left outer join swcode on swcode.code = cpcode.swcode      
  99.   where pz_date>=to_date(vs_start_day,'yyyymmdd')       
  100.   and pz_date<=to_date(vs_end_day,'yyyymmdd')       
  101.   and pz_flag = 'R'       
  102.   and jzhs_flag<>'R'      
  103.   --and cpcode.swcode = rec_swcode.swcode      
  104.   and FLOOR(to_date(vs_end_day, 'yyyymmdd')-pz_date)      
  105.   >      
  106.   case sh_unpass_sub.hsjg      
  107.     when '3' then 69      
  108.   else     
  109.     case sh_unpass_sub.hsfs       
  110.         when '1' then 7       
  111.         when '2' then 36      
  112.         when '3' then 72       
  113.       else 7      
  114.     end     
  115.   end     
  116.   group by swcode      
  117.    ) sel5 on sel5.swcode = swcode.code      
  118.      
  119.   --到期超时核实完结条数      
  120.   left outer join       
  121.   (      
  122.   --insert into dchsjsltjb_tmp(swcode,num6)       
  123.   select cpcode.swcode as swcode ,      
  124.     sum(      
  125.     floor      
  126.     (      
  127.     case sh_unpass_sub.hsjg       
  128.     when '3' then     
  129.      case       
  130.          when jzhs_date-pz_date>69      
  131.               then (jzhs_date-pz_date-69)/10+1      
  132.          else 0      
  133.      end           
  134.     else       
  135.         case sh_unpass_sub.hsfs       
  136.             when '1' then        
  137.                  case       
  138.                   when jzhs_date-pz_date>7       
  139.                    then (jzhs_date-pz_date-7)/7+1      
  140.                    else 0      
  141.                  end     
  142.             when '2' then       
  143.                   case       
  144.                   when jzhs_date-pz_date>36       
  145.                    then (jzhs_date-pz_date-36)/10+1      
  146.                    else 0      
  147.                  end     
  148.             when '3' then       
  149.                   case       
  150.                   when jzhs_date-pz_date>72       
  151.                    then (jzhs_date-pz_date-72)/10+1      
  152.                    else 0      
  153.                  end     
  154.             else 0      
  155.         end     
  156.     end     
  157.     )       
  158.     ) as v6       
  159.     --into vn_dqcshswjts      
  160.     from sh_unpass_sub       
  161.     left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id       
  162.     left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE      
  163.     --left outer join swcode on swcode.code = cpcode.swcode      
  164.     where pz_date>=to_date(vs_start_day,'yyyymmdd')       
  165.     and pz_date<=to_date(vs_end_day,'yyyymmdd')       
  166.     and pz_flag = 'R'       
  167.     and jzhs_flag = 'R'      
  168.     --and cpcode.swcode = rec_swcode.swcode;      
  169.      group by swcode      
  170.       ) sel6 on sel6.swcode = swcode.code       
  171.      
  172.       where swcode.flag='3'      
  173.       ;      

相关推荐

Global site tag (gtag.js) - Google Analytics