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;
相关推荐
兰令水4 分钟前
【agent第3篇】agent上下文+面经
java·大数据·数据库
*neverGiveUp*4 分钟前
PostgreSql常用SQL大全
数据库·sql·postgresql
真实的菜21 分钟前
Redis 从入门到精通(三):持久化机制 —— RDB 与 AOF 深度解析
数据库·redis·缓存
We Just Keep growing30 分钟前
【MySQL运维篇】——日志、主从复制、分库分表、读写分离
java·运维·数据库·windows·学习·mysql
橙子圆12334 分钟前
Redis知识10之缓存
数据库·redis·缓存
每天都要进步哦38 分钟前
MySQL快速入门指南:从零基础到基本操作
数据库·mysql·oracle
bjzhang7542 分钟前
mysql 常用命令
数据库·mysql
计算机安禾1 小时前
【算法分析与设计】第48篇:流算法与数据概要技术
java·服务器·网络·数据库·算法
数据库小学妹1 小时前
时序数据库核心原理拆解:写入吞吐、压缩存储、融合分析全链路分析
数据库·经验分享·时序数据库·dba
我是一颗柠檬1 小时前
【Redis】Redis缓存应用实战Day12(2026年)
数据库·redis·缓存