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;
处理大批数据的时候,游标对逐行处理会很慢,而且你的写法,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都只有一个,会快很多。
如果觉得有帮助,请采纳:)
loop你打错了~
打一个比喻来解释吧
for 100元 in ( 你的银行卡)
loop
用100元买东西;
钱用完了;
end loop;
意思是每次取出来100元,花没了再取,一直到你银行卡里没钱为止
所谓显式游标,就是声明过游标,可以理解为显示出来让别人知道;
至于隐式游标,不需要声明,直接默默的使用就行了
你这个是for循环的隐式游标
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。