重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
两种方式实现oracle批量提交
创新互联专注于松溪网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供松溪营销型网站建设,松溪网站制作、松溪网页设计、松溪网站官网定制、微信小程序开发服务,打造松溪网络公司原创品牌,更为您提供松溪网站排名全网营销落地服务。
方式一:利用 fetch .. bulk collect into .. limit limitnumber;--limitnumber批量提交条数
declare Cursor dataCursors
is
/*定义游标*/
;
type dataCursor is table of tablename%rowtype;
dataCursorP dataCursor;
begin
open dataCursors;
while (true) loop
fetch dataCursors bulk collect into dataCursorP limit 50;
forall i in 1 .. dataCursorP.count
insert into tablename values dataCursorP(i);
commit;
exit when dataCursors%notfound;
end loop;
close dataCursors;
end;
方式二:自己实现批量提交功能
实现原理:定义一个number类型的记录数,游标循环过程中记录数自增1,利用mod判断如果是否整除,整除就提交。
declare executenum:=0;
declare Cursor dataCursors
is
/*定义游标*/
;
dataCursor dataCursors%rowtype;
begin
for dataCursor in dataCursors
loop
executenum:=executenum+1;
/*update,insert or delete 等操作 */
if mod(executenum,50)=0 --这里设置50条一提交
then commit;
end if;
end loop;
commit;--最后提交一次,因为有可能最后不是50的整数
end;
--executenum还可以记录操作的条数,
大数据量提交可能会造成系统瘫痪,所以不建议这样做。
如果有需要,可以在导出insert语句的时候分批次commit(提交)。
方法如下:
1、登录plsql,进入导出表
2、选择要导出的表,然后下图位置根据需要写上每次多少行提交,选择导出路径,点击导出即可
begin
v_cnt number:=0;
loop
delete from a where rownum=100000;
v_cnt:=SQL%ROWCOUNT;
commit;
exit when v_cnt=0;
end loop;
end;
几千行对 oracle 来说不是问题,可以一次提交
如果一定要这么做,有两种方式:
一,用游标打开,一行拼一个insert 语句,并计数;满100后提交
二,分页查询,每页100行 ,然后提交
我觉得:能一次提交的尽量不要分开提交,如果提交到一部分时候,出现问题了,提交的不能回滚了。增加了业务逻辑的复杂性。
没什么好办法,要么就最后提交一次,
要么就按照条件筛选数据,分别提交
如:
insert into table_a select * from table_b where type=1;
commit;
insert into table_a select * from table_b where type=2;
commit;
就是举个例子,最后的type要是个全集