sql 批量脚本

开发过程中不管是出于需求还是测试,对于数据往往会用到批量操作。

由于踩坑,重点说下批量删除。

    对数亿级数据批量删除,往往会踩到坑,这就需要注意啦,一条delete语句,undo段会比较大,未提交是一直受到保护,其他事物的操作会受到影响,执行时间会比较长或挂起,造成表死锁。如何批量删除且不影响其他事物的操作?这就需要尽量将大的事物划分为小的事物去操作,避免其他事物的执行。

declare  
   cursor mycursor is SELECT  ROWID FROM TEST WHERE  XXX=XXXX  order by rowid;   <--------按ROWID排序的Cursor,删除条件是XXX=XXXX,根据实际情况来定。
   type rowid_table_type is  table  of rowid index by pls_integer;
   v_rowid   rowid_table_type;
BEGIN
   open mycursor;
   loop
     fetch  mycursor bulk collect into v_rowid  limit 10000;   <--------每次处理10000行搜索,也就是每10000行一提交
     exit when v_rowid.count=0;
     forall i in v_rowid.first..v_rowid.last
        delete from test  where rowid=v_rowid(i);
     commit;
   end loop;
   close mycursor;
END;

(SQL 游标:
1、把记录集传给游标;
2、打开游标
3、开始循环
4、从游标中取值
5、检查那一行被返回
6、处理
7、关闭循环
8、关闭游标)

下面一个批量插入脚本,每100条记录提交一次。

批量写入脚本:
 begin
  for i in 1 .. 100000 loop
    insert into test_table
      (test_ID,
       USER_ID,
       CODE,
       EXCHANGE_TYPE,
       OPERATION_TYPE,
       CREATED_DATE)
    values
      (seq_operation_record.nextval,
       to_char(i),
       '600000',
       'SH',
       'i',
       to_date('2017-01-03 00:00:00', 'yyyy-mm-dd hh24:mi:ss'));
    if mod(i, 100) = 0 then
      commit;
    end if;
  end loop;
end;

 

 

转载于:https://my.oschina.net/u/2532095/blog/1594543

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值