`
viwo
  • 浏览: 221641 次
  • 性别: 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.       ;      

相关推荐

    使用Oracle游标实现多级展开菜单树.pdf

    在实现多级菜单树的过程中,我们首先将所有节点ID收集到一个临时表中。然后,根据菜单的层级创建相应数量的临时表,每个表存储一个层级的节点信息。接着,通过LEFT JOIN将这些临时表按层级连接起来,形成一个结果集...

    SQL补充触发器临时表与游标PPT学习教案.pptx

    SQL中的触发器是一种特殊...总的来说,这个PPT学习教案涵盖了SQL中的关键概念,包括触发器、存储过程、临时表和游标,这些都是数据库管理和开发的重要组成部分,对于理解SQL的高级功能和实现复杂的业务逻辑至关重要。

    游标使用的实例,学习一点总结

    接下来,我们来看一个更实际的应用场景,其中涉及到两个表:`className` 和 `productInfo`。`className` 表包含班级信息,`productInfo` 表包含产品信息。我们的目标是从每个班级的产品中选取点击量最高的一个产品。...

    存储过程,要用到指针,临时表

    临时表分为两种:本地临时表(以单个#开头)仅对当前会话可见,而全局临时表(以两个##开头)在整个系统中可见,直到所有引用它的会话都结束。在存储过程中,你可以创建临时表来存储查询结果,然后进行进一步的处理...

    sql游标的运用.txt

    游标可以被视为一个临时存储区域,其中包含了由SELECT语句返回的数据行。 #### 创建与使用游标 创建游标的基本语法如下: ```sql DECLARE cursor_name CURSOR FOR SELECT column1, column2, ..., columnN FROM ...

    Sql游标使用

    除了基本的游标使用,例子中还展示了一个更复杂的场景,创建了两个临时表`#Temp1`和`#Temp2`,然后通过游标来合并数据。在游标操作中,如果`#Temp2`已经存在与当前`#Temp1`中`deptid`相同的记录,那么就在`#Temp2`的...

    mysql游标存储过程例子

    根据提供的文件信息,本文将详细解释一个MySQL存储过程的例子,其中包含了游标的使用。这个存储过程主要用于处理一批数据,涉及到日期范围内的数据处理、异常处理等。下面将逐一解析存储过程中涉及的重要知识点。 #...

    公交线路查询算法与实现PPT学习教案.pptx

    《公交线路查询算法与实现》的学习教案主要涵盖了公交线路查询系统的开发流程和技术要点,包括数据实体层、表示层、业务逻辑层以及数据访问层的实现。在这个系统中,查询算法的构建是核心部分,涉及到Oracle数据库中...

    DB2编程技巧与实用技术

    此外,游标有两种定义方式:一种是传统的声明和处理方式,允许使用`WITH HOLD`,但较为复杂;另一种是使用`FOR`循环,简化了代码,但不支持`WITH HOLD`。根据具体需求,可以选择适合的方式来处理游标。 修改游标...

    pkg_XXX.rar_oracle_oracle record cursor

    在Oracle数据库系统中,"pkg_XXX.rar_oracle_oracle record cursor" 提供了一个学习和参考的案例,涉及到了存储过程、游标(cursor)、记录(record)以及动态SQL和临时表的使用。这些概念是Oracle数据库编程的核心...

    mysql优化——部分

    本篇文章将深入探讨两个关键的MySQL优化技术:存储过程优化和索引优化,具体为使用临时表代替游标以及巧建SUM索引来提升效率。 首先,我们来谈谈MySQL存储过程中的优化策略——使用临时表代替游标。游标在处理复杂...

    mysql的存储过程、游标 、事务实例详解

    然后,打开`cur`游标遍历临时表,对于每一行数据,再打开`cur2`游标检查正式表。如果正式表中没有匹配的记录,则将数据插入正式表并删除临时表中的对应记录。同时,使用计数器`counts`控制每处理1000条数据提交一次...

    SQLServer高频面试题及答案

    存储过程和函数都是数据库中的一种程序单元,但是存储过程可以执行某些特定的业务逻辑,而函数只能返回一个值。 7. 什么是视图? 视图是一种虚拟的表,它是根据其他表或视图计算生成的。视图可以用来简化数据访问...

    plsql面试题

    `EXISTS` 和 `IN` 子查询是两种常用的方式,其中 `EXISTS` 更适合于仅检查记录的存在性而不关心其值的情况。 - **聚合函数与分组:** `WHERE` 子句用于过滤行,而 `HAVING` 子句则用于过滤分组后的结果集,通常与...

    mysql存储过程优化

    本文将探讨两个重要的优化策略:使用临时表代替游标以及巧建SUM索引来提升查询效率。 首先,我们来讨论“使用临时表代替游标”。在MySQL存储过程中,游标通常用于逐行处理结果集,但这种方式在处理大数据量时可能会...

    mysql 树形结构查询

    在 findLChild 存储过程中,我们首先创建了一个临时表 tmp_table,以便于存储树形结构的数据。然后,我们设置了递归深度为 99,以便于控制查询的深度。接着,我们调用了 iterative 存储过程以实现树形结构的查询。...

    数据库sqlserver攻关

    这是一个需要使用SQL Server的窗口函数(如LAG)来实现的功能,通过在SELECT语句中应用窗口函数,可以访问当前行的前一行数据,然后用该数据来填充NULL值。 ### SQL Server的调优工具和性能优化工具及执行计划详解 ...

    45-tips-database-performance-tips-for-developers

    4. **使用窗口函数**:窗口函数如ROW_NUMBER(), RANK(), DENSE_RANK()等可以在不使用子查询或临时表的情况下实现复杂的业务逻辑。 5. **避免游标**:游标是一种强大的工具,但它对性能的影响往往被低估。尽可能使用...

    SQL2005 触发器

    - **优点**:触发器可以实现复杂的业务规则和数据约束,提供了一种维护数据库完整性的有效手段。 - **缺点**:过度使用触发器可能会导致性能下降,因为它们增加了数据库的复杂性并可能在不明显的地方引入副作用。...

    知道某个字段的值(例如:“张三”),需要查询在其他某个表中有没有相同的值

    下面是一个使用 Oracle 存储过程实现字段值查询的示例: 首先,创建一个临时表 TMPTABLE,用于存储查询结果: ```sql create table TMPTABLE( NAME VARCHAR2(500) ); ``` 接下来,创建一个存储过程 QUERY_KEY,...

Global site tag (gtag.js) - Google Analytics