欢迎投稿

今日深度:

oracle存储过程+游标处理select数据,oracle存储过程

oracle存储过程+游标处理select数据,oracle存储过程


create or replace
PROCEDURE UPDATE_RECORDCODE is
  cursor location_data is select * from location where remark in('952701','9527008','952705');--申明游标
  serviceCode NUMBER:=1;
BEGIN
    for l in location_data loop  --遍历游标
      BEGIN
        --业务处理
         UPDATE SERIAL_CODE SET CUR_NUMBER = CUR_NUMBER +1 where AREA_CODE=l.area_code and LOC_TYPE=l.type;
         select  CUR_NUMBER into serviceCode from SERIAL_CODE where AREA_CODE=l.area_code and LOC_TYPE=l.type;
         
         update location lu set putrecord_code=(l.area_code||'0'||l.type||lpad(serviceCode,6,0)) where lu.id=l.id; 
         --dbms_output.put_line(ServiceCode);
         EXCEPTION--异常处理
        WHEN NO_DATA_FOUND THEN 
           INSERT INTO SERIAL_CODE (AREA_CODE, LOC_TYPE,CUR_NUMBER) VALUES (l.area_code,l.type,1);
       end;
    end loop; 
    commit;
END UPDATE_RECORDCODE;


oracle存储过程效率问题,处理1500w的数据插入

处理大批数据的时候,游标对逐行处理会很慢,而且你的写法,commit在循环中,也会很慢。
其实你的功能可以用一个不循环的语句解决。
假设你定义游标的语句是(假设你的源数据表名为test):
select rpt.a,rpt.b,rpt.c,rpt.zy,rpt.zc,rpt.zd,rpt.zr,rpt.df from test rpt;
你的功能可以用以下语句解决:
insert into targ@dc_link (a,b,c,bianma,zhi)
select rpt.a,rpt.b,rpt.c,'0'||num,decode(num,1,rpt.zy,2,rpt.zc,3,rpt.zd,4,rpt.zr,5,rpt.df) from test rpt,(select rownum num from test where rownum<6);
commit;

这样的好处是语句和commit都只有一个,会快很多。

如果觉得有帮助,请采纳:)
 

oracle数据库的存储过程中可以用到隐形游标但是我不太明白为何可以用 for in loop来完成对数据的处理

loop你打错了~

打一个比喻来解释吧

for 100元 in ( 你的银行卡)
loop
用100元买东西;
钱用完了;
end loop;

意思是每次取出来100元,花没了再取,一直到你银行卡里没钱为止

所谓显式游标,就是声明过游标,可以理解为显示出来让别人知道;
至于隐式游标,不需要声明,直接默默的使用就行了
你这个是for循环的隐式游标
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/2998.html NewsArticle oracle存储过程+游标处理select数据,oracle存储过程 create or replacePROCEDURE UPDATE_RECORDCODE is cursor location_data is select * from location where remark in(952701,9527008,952705);--申明游标 serviceCode NUMBER:=1;BEGI...
评论暂时关闭