当前位置: 代码迷 >> Oracle管理 >> 写了一个存储过程,老师要求不用游标遍历,用集合,如何改
  详细解决方案

写了一个存储过程,老师要求不用游标遍历,用集合,如何改

热度:187   发布时间:2016-04-24 04:14:59.0
写了一个存储过程,老师要求不用游标遍历,用集合,怎么改
DECLARE
        CURSOR getnonlegalchildren_cur
        IS
           SELECT *           FROM   MAIN
           WHERE  MAIN.A_KEY <> MAIN.B_KEY
           AND    MAIN.CM       <> 0
           AND    MAIN.FLAG      = 'N'; 
           
           v_record                          getnonlegalchildren_cur%ROWTYPE;
           
BEGIN
    FOR  v_record IN getnonlegalchildren_cur
    LOOP
    END LOOP;

END;

老师说游标遍历太慢,要求用set based update,求大虾们指点
------解决方案--------------------
update main am
   set am.cmmt_amt =
       (select am.cmmt_amt - x.cmmt_amt from MAIN x where am.a_key = x.b_key)
 where exists (select 1
          from AUTOGRADE_MAIN a_m
         where a_m.acct_nat_key = am.ult_prt_acct_nat_key)
   and exists (select 1
          from MAIN x
         where am.a_key = x.b_key
           and x.A_KEY <> x.B_KEY
           AND x.CM <> 0
           AND x.FLAG = 'N')

你上面的if (exists()) 应该会报错的吧,没有这个语法
------解决方案--------------------
满足am.a_key = x.b_key条件可能出现多条,需要求和
update main am
   set am.cmmt_amt =
       (select am.cmmt_amt - nvl(sum(x.cmmt_amt),0) from MAIN x where am.a_key = x.b_key)
 where exists (select 1
          from AUTOGRADE_MAIN a_m
         where a_m.acct_nat_key = am.ult_prt_acct_nat_key)
   and exists (select 1
          from MAIN x
         where am.a_key = x.b_key
           and x.A_KEY <> x.B_KEY
           AND x.CM <> 0
           AND x.FLAG = 'N')
  相关解决方案