oracle insert操作分批量提交

对临时表做insert插入时没有做批量提交,可能会导致undo表空间撑爆,修改脚本对插数进行2万一次的批量提交,并且修改索引和同义词创建时间在插数操作结束后。

原语句

复制代码
insert into 目标表 select * from 源表;

改为2w次一提交

复制代码
DECLARE
    CURSOR data_cursor IS
        SELECT *
        FROM 源表;
    TYPE data_array IS TABLE OF data_cursor%ROWTYPE;
    data data_array;
BEGIN
    OPEN data_cursor;
    LOOP
        FETCH data_cursor BULK COLLECT INTO data LIMIT 20000; -- 每次获取2万条数据
        FORALL i IN 1..data.COUNT
            INSERT INTO 目标表 
            VALUES data(i);
        COMMIT; -- 每次提交
        EXIT WHEN data_cursor%NOTFOUND;
    END LOOP;
    CLOSE data_cursor;
END;
/

删除目标表数据(2022-12-31 23:59:59之前的表数据)

复制代码
DECLARE
  COMMIT_INTERVAL NUMBER := 10000; -- 每次提交的记录数
  COMMIT_COUNT NUMBER := 0;
BEGIN
  FOR rec IN (SELECT * FROM 目标表 WHERE createtime < '2022-12-31 23:59:59'  ) LOOP
    DELETE FROM ER_VOUCHER WHERE id = rec.id;
    COMMIT_COUNT := COMMIT_COUNT + 1;
    
    -- 每次删除一万条记录后提交
    IF COMMIT_COUNT >= COMMIT_INTERVAL THEN
      COMMIT;
      COMMIT_COUNT := 0;
    END IF;
  END LOOP;

  -- 提交剩余的记录
  COMMIT;
END;
相关推荐
Solis程序员2 分钟前
MongoDB 超全入门到实战:从原理、CRUD到高可用架构
数据库·mongodb·架构
yurenpai(27届找实习中)6 分钟前
redis_点评(26.附近店铺——实现附近商家功能)
数据库·spring boot·redis
BullSmall8 分钟前
异构数据库(通俗 + 核心知识点)
数据库
Rick199312 分钟前
索引下推(ICP):在已经用到联合索引的前提下,减少回表次数,提升查询效率
数据库
金海境科技15 分钟前
实践分享!虚拟化数据恢复前三标准
数据库
不剪发的Tony老师22 分钟前
RedisME:一个现代化、轻量级Redis管理工具
数据库·redis
金海境科技30 分钟前
实践分享!服务器数据恢复口碑榜
数据库
llilay44 分钟前
企业级FastAPI后端模板搭建(三)整合日志Log
数据库·python·fastapi
treacle田1 小时前
使用达梦DTS迁移Oracle数据到达梦数据库过程步骤-记录总结
数据库·dts 迁移oracle到达梦
就叫飞六吧1 小时前
MySQL 驱动里那个 `cj` 到底是什么?
数据库·mysql