请教大虾们,反复执行同一个游标(cursor),每次从表中取出1000条,直到将表中的数据取完;

问题描述:现在有一个表有10000W行记录,非常大的表,我知道如果一次性将这10000W放入游标中,循环遍历每一条记录进行处理的话,效率越来越低,最后数据库的undo空间马上用完,所以我想反复执行这个curosr,每次取出100W条进行处理,处理完后再次执行游标再取出100W,直到将这个表中所有数据全部处理完毕,现在想知道如何写这个循环?

我的业务处理规则如下:

定义游标cursor
循环游标cursor
每条进行业务处理后放入数组
最后将数组一次性插入表中

具体结构如下
cursor A is select * from 原始表 A where rownum <=100000 and not exists
(select * from 主键表 B where B.主键 =A.主键 )

LOOP
OPEN A
LOOP
FETCH ....
insert into 主键表 values(主键)
取出每条记录业务处理后放入数组
forall ...inert into 目标表 数组
end loop
close A
end loop

大体就是这样,难点是如果控制循环,如果curosr为空就关闭,就退出,如果不为空,就fetch,处理完100w条后,重新执行curosr再取100w来执行

据我理解,游标并不太占资源。就fetch一条
如果你做处理的时候,怕影响其他用户读数据,你可以分批处理,比如说处理这个月的数据。
如果不影响其他用户,反正是所有的处理都一次完成,只是你的方法比较复杂。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-01-25
while @@fetch_status=0 --判断是否成功获取数据
begin
update table1 set name=name+'1'
where id=@id --进行相应处理(跟据需要填入SQL文)

fetch next from cursor1 into @id,@name --将游标向下移1行
end

close cursor1 --关闭游标
deallocate cursor1
相似回答