oracle 通过存储过程 实现批量插入(1)

问题:大批量数据插入,生成大量的undo日志。由于数据库性能问题,导致无法一次性提交成功。

解决思路: 通过loop 进行分批插入

1、创建中间表

-- Create table
create table INSERT_STATS
(
  table_name VARCHAR2(20),
  data       NUMBER(20),
  hour       DATE default sysdate
);
-- Add comments to the columns 
comment on column INSERT_STATS.table_name
  is '表名';
comment on column INSERT_STATS.data
  is '数据量';
comment on column INSERT_STATS.hour
  is '时间';
View Code

2、创建存储过程(objective:目的表,source:原表)

create or replace procedure batchinsert as
  --记录数据插入的次数
  v_count number := 0;
  --目标表的表名
  purpose varchar2(20) := 'objective';
  --把需要插入的数据存在游标里面
  cursor cs is
    SELECT djxh from source t;

BEGIN
  --遍历游标里面的数据
  FOR c IN cs LOOP
    --把遍历出来的数据插入到目标表
    insert into objective (djxh) values (c.djxh);
    v_count := v_count + 1;
    --根据数据库性能,设置提交的数据量
    IF MOD(v_count, 1200000) = 0 THEN
      COMMIT;
      --把每次插入的数据,存到中间表
      insert into insert_stats
        (table_name, data)
        select purpose, count(1) from objective;
      COMMIT;
    END IF;
  END LOOP;
  COMMIT;
  insert into insert_stats
    (table_name, data)
    select purpose, count(1) from objective;
  COMMIT;
END batchinsert;
View Code

3、运行存储过程(在命令窗口运行) 

exec batchinsert;
View Code

 

posted @ 2021-02-12 21:26  shiyunyier  阅读(1148)  评论(0)    收藏  举报