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')