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;
相关推荐
风哥2号1 分钟前
数据库教程FGMT02‑生产环境Linux+Oracle19c安装配置与项目实战
linux·数据库·ffmpeg
九皇叔叔4 小时前
【第二章】Redis基础入门:Redis是什么、为什么快以及核心特性详解
数据库·redis·缓存
云和恩墨4 小时前
删库不跑路,回滚极速触达——zData S“旁路日志”持续保护原理深剖
数据库
MetaLite5 小时前
SpringBoot接口分层规范-外网网关内部服务与参数边界
java·数据库·spring boot
Wang's Blog7 小时前
Java框架快速入门: Spring Security+OAuth2之元注解简化权限表达式
java·数据库·spring
蓝速科技9 小时前
医院导诊 AI 数字人一体机场景适配与落地指南丨蓝速科技
运维·数据库·人工智能·科技·自然语言处理·技术分享
QYR-分析9 小时前
重轨受电弓行业深度报告:市场格局、技术迭代与发展前景
大数据·数据库·人工智能
泡泡鱼(敲代码中)9 小时前
MySQL基础学习笔记:从数据模型到DDL全掌握
开发语言·数据库·笔记·学习·mysql
l1t10 小时前
DeepSeek总结的chdb-core v26.7.3发版说明
数据库·clickhouse·oracle
冰暮流星11 小时前
mysql之表子查询
数据库·mysql