Oracle存储过程,更新大量数据,如何循环分批次提交? 50

例如下面两张表:班级表:classclassID--pk学生表:studentstudentID--pkclassID--fkage--普通字段,年纪一个班级对应多个学生... 例如下面两张表:
班级表: class
classID --pk
学生表: student
studentID --pk
classID --fk
age --普通字段,年纪
一个班级对应多个学生。

新的一年到来,我们指定一个classID, 把这个班级里所有学生都age + 1,需要的是:
普通做法是: update student set age = age + 1 where classID = #classID#.,如果学生特别多,可能数据库受不了,所以所以要求循环处理,每10个学生更新一次,请问如何做到,求高效的SQL语句
展开
 我来答
badkano
推荐于2017-09-06 · 知道合伙人体育行家
badkano
知道合伙人体育行家
采纳数:144777 获赞数:885363
团长

向TA提问 私信TA
展开全部

可通过以下方法:

以100条数据为例,如果海量数据可参考。

如test表中有如下数据:

现要将begintime改成当前时间,每10条提交一次。

可用如下存储过程:

declare 
i int;--定义变量
v_count int;--定义变量
v_loop int;--定义变量
begin
 select count(*) into v_count from test;--计算表内数据总数
 select ceil(v_count/10) into v_loop from dual;--计算需要循环次数
 i:=1;--为i赋值
 while i<=v_loop loop--循环退出条件
   update test set begintime=sysdate where begintime is null and rownum<=10;--执行更新
   commit;--提交
   i:=i+1;--i依次加1
 end loop;--结束循环
end;
末日高督
2015-06-12 · TA获得超过303个赞
知道小有建树答主
回答量:469
采纳率:0%
帮助的人:255万
展开全部
你想多了.此类的更新 就应该是 update student set age = age + 1 where classID = #classID#.
依靠循环处理 ,增加事务的递交次数,反而 影响 数据库服务器的性能 和资源.

相信我,数据库处理的能力远超过你的想象,早在15年前,远古的sql2000都可以承载 百万级的数据炒作.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tj_angela
2015-06-12 · TA获得超过7530个赞
知道大有可为答主
回答量:6797
采纳率:75%
帮助的人:2537万
展开全部
再多Oracle也处理得了,即使是百万千万级别,再多就不适合用更新做法,思路就要换了
如果你非要这么弄的话,通过rowid和rownum来做循环,但是意义不大
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2015-10-23
展开全部
参考:
www.
cnblogs.
com/
mellowsmile/
p/
4721742
.html
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式