十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
两种方式实现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还可以记录操作的条数,
这个commit应该是本机的,和dblink没什么关系,而且就算你找到的dblink的那个session那么也不行,以为这个session在dblink的操作完成后已经关闭了。
个人感觉不要这么远程insert,最好是调用一个那个数据库上的过程去insert这样的话,在那个过程中commit肯定是没有问题的。
如果必须要这么写,那么可以加入一条insert和一条delete
就是上面是正常insert的语句。
下面有一条delete(这条删除一个绝对不可能出现的一条试试)
按照你的说法,第二个事务提交时,第一个事务才能commit。可是这样会出现问题,因为如果你大量提交,那么数据库会因此夯住的,所以你看看第一个办法行不行,我觉得第一个办法还靠谱点。
显式提交和隐式提交
显式提交,比如出现commit,这类的就是显式提交。
隐式提交是不用写commit的提交,比如alter语句的提交。
大数据量提交可能会造成系统瘫痪,所以不建议这样做。
如果有需要,可以在导出insert语句的时候分批次commit(提交)。
方法如下:
1、登录plsql,进入导出表
2、选择要导出的表,然后下图位置根据需要写上每次多少行提交,选择导出路径,点击导出即可
执行就是计算的过程,在执行过程中会写日志缓冲区,也可能会写日志文件,提交的时候,主要是写日志,如果日志已经写到日志文件了,那么也就是做一个提交的标记。
执行跟提交,都不会直接写数据文件,数据文件写的触发有其自己的机制,正因为不写数据文件,执行完成之后,提交的过程非常的快,输入命令回车
直接就提示完成了。
可通过以下方法:
以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;