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 分钟前
在线保险服务与管理平台的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·服务平台·在线保险
做运维的阿瑞34 分钟前
SQL 面试高频:用户、商品、订单三表查询全解析
数据库·sql·mysql
CJi0NG2 小时前
【自用】MySQL - 语法:DDL、DML、DQL、DCL
数据库·mysql
姜鱼问生2 小时前
数据库备份 + 灾难恢复演练:从 dump 恢复全库
运维·数据库
ao-weilai3 小时前
MySQL数据库:表约束
数据库·mysql·adb
ly76893 小时前
Redis 分布式锁的边界条件:Redlock 争议、锁续期与客户端崩溃后的互斥失效
数据库·redis·分布式·分布式锁·watchdog·redlock
kaixin_learn_qt_ing3 小时前
qgeoview-samples-basic
数据库
Omics Pro4 小时前
微软:多模态生物世界模型
数据库·人工智能·算法·microsoft·机器学习·自然语言处理
字节渡客4 小时前
接口明明返回成功,数据库偶尔就是没写入
数据库
Ivanqhz4 小时前
KV Cache
服务器·数据库·人工智能·深度学习·算法