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 '时间';
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;
3、运行存储过程(在命令窗口运行)
exec batchinsert;
开源改变生活

浙公网安备 33010602011771号