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;
相关推荐
百***92024 分钟前
【MySQL】MySQL库的操作
android·数据库·mysql
q***76664 分钟前
Spring Boot 从 2.7.x 升级到 3.3注意事项
数据库·hive·spring boot
信仰_27399324317 分钟前
Redis红锁
数据库·redis·缓存
人间打气筒(Ada)25 分钟前
Centos7 搭建hadoop2.7.2、hbase伪分布式集群
数据库·分布式·hbase
心灵宝贝32 分钟前
如何在 Mac 上安装 MySQL 8.0.20.dmg(从下载到使用全流程)
数据库·mysql·macos
奋斗的牛马1 小时前
OFDM理解
网络·数据库·单片机·嵌入式硬件·fpga开发·信息与通信
忧郁的橙子.2 小时前
一、Rabbit MQ 初级
服务器·网络·数据库
杰杰7982 小时前
SQL 实战:用户访问 → 下单 → 支付全流程转化率分析
数据库·sql
爬山算法2 小时前
Redis(120)Redis的常见错误如何处理?
数据库·redis·缓存
野生技术架构师3 小时前
盘一盘Redis的底层数据结构
数据结构·数据库·redis