原文地址:http://www.cnblogs.com/liaoyu/p/oracle-procedure-batch-insert.html

作者:L君还在说之乎者也

最近在工作中,需要使用生成一些测试数据用来测试项目性能,我一开始是通过使用python生成SQL再执行,但性能不理想,今天想试试使用oracle的存储过程来实现下,效果还不错。

实现相关

表结构

desc TMP_UPSTATE_CASEKEY
Name Null Type
------------------- -------- ----------
TMP_UPSTATE_CASEKEY NOT NULL CHAR(14)
TMP_NUM_STATUS_ID NOT NULL NUMBER(38)
UPDATED_DATE NOT NULL DATE

需要生成的SQL

insert into TMP_UPSTATE_CASEKEY values('TMP0000001', 1, sysdate);

存储过程实现

create or replace procedure proc_casekey_upstate
as
casekey char(14);
begin
for i in 1..10000000 loop
casekey := 'TMP'||lpad(i,7,0); -- TMP0000001
insert into TMP_UPSTATE_CASEKEY values(casekey, 1, sysdate);
end loop;
commit;
end; begin
proc_casekey_upstate();
end;

测试发现生成一千万条数据用了14分钟左右,性能还是可以了,如果先去掉TMP_NUM_STATUS_ID的外键估计更快。

网友 雷厉*风行 指出下面的方式速度更快,我测试插入一百万条记录十秒左右,当然了,这跟机器性能也有关系。

insert into TMP_UPSTATE_CASEKEY select 'TMP'||LPAD(rownum,7,0),1,sysdate from dual connect by level <= 1000000;

使用python生成SQL文件

下面贴出使用python3生成SQL的代码

from datetime import datetime

start = datetime.now();
with open('d:/casekey_upstate.sql', 'w') as f:
for x in range(1, 10000000):
print("insert into tmp_upstate_casekey values('TMP%07i', 1, sysdate);" %x, file=f);
end = datetime.now();
print(end-start);

生成的sql文件达638M, 耗时31秒,有木有感觉使用python很方便呢。

注:使用的python版本为3.4

使用Oracle的存储过程批量插入数据的更多相关文章

  1. PG数据库创建并执行存储过程批量插入数据

    记录一下PG数据库创建并执行存储过程批量插入数据的SQL: create or replace function addId() returns boolean AS $BODY$ declare i ...

  2. Oracle 存储过程批量插入数据

    oracle 存储过程批量插入大量数据 declare numCount number; userName varchar2(512); email varchar2(512); markCommen ...

  3. sqlserver存储过程批量插入数据

    在系统中经常会遇到向数据库中批量插入数据情况,存储过程中没有数组,只有通过字符串分割循环插入,下面是一个本人研究的一个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 c ...

  4. mysql应用存储过程批量插入数据

    --批量插入数据的sql语句 delimiter $$ DROP PROCEDURE IF EXISTS `test.sp_insert_batch` $$ CREATE DEFINER =`root ...

  5. oracle结合mybatis批量插入数据

    先上代码: controller: result = service.insertTRbXdhjLendYdData(params); service: List<TRbXdhjLendDTO& ...

  6. Oracle 逐条和批量插入数据方式对比

    创建测试表 create table base_users ( userid         varchar2(16), username  varchar2(32), passwd      var ...

  7. mysql利用存储过程批量插入数据

    最近需要测试一下mysql单表数据达到1000W条以上时增删改查的性能.由于没有现成的数据,因此自己构造,本文只是实例,以及简单的介绍. 首先当然是建表: [sql]view plaincopy CR ...

  8. mysql存储过程批量插入数据

    DROP TABLE IF EXISTS TeachersInfo; CREATE TABLE TeachersInfo ( id INT NOT NULL AUTO_INCREMENT, teach ...

  9. postgres 使用存储过程批量插入数据

    參考资料(pl/pgsql 官方文档): http://www.postgresql.org/docs/9.3/static/plpgsql.html create or replace functi ...

随机推荐

  1. Scala语言初识

    scala是一种集面向对象特性和函数式特性于一身并可运行在JVM上的强类型静态语言.因为可以运行在JVM上,并在设计时借鉴于大量的java语言特性,故可以和java互动并可以调用java相关类库,这让 ...

  2. Ext.Net学习笔记16:Ext.Net GridPanel 折叠/展开行

    Ext.Net学习笔记16:Ext.Net GridPanel 折叠/展开行 Ext.Net GridPanel的行支持折叠/展开功能,这个功能个人觉得还说很有用处的,尤其是数据中包含图片等内容的时候 ...

  3. 9月18日,SQL学习基础1

    数据库管理和应用 Oltp是小型的管理,OLAP是大型的管理 开发的内容如触发器 数据库管理系统(Database Management System,简称为DBMS)是位于用户与操作系统之间的一层数 ...

  4. GridView 自定义表头

    //修改表头 protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) { switch (e.Row.Ro ...

  5. Windows下lex 与 yacc的使用(2)

                                 Windows下lex 与 yacc的使用                                                   ...

  6. 划分分区GPT11

    umount /dev/sda1 /data1umount /dev/sdb1 /data2mount /dev/sdb1 /data1umount /dev/sdb2 /data3umount /d ...

  7. [openMP] OpenMP在visual studio和mac上的配置

    今天弄了半天才弄好mac上的openmp,一方面智商下限,另一方面竟然发现网上也没有什么详细过程,特意把我的配置过程贴上来 多核编程可以认为是对多线程编程做了一定程度的抽象,提供一些简单的API,使得 ...

  8. MSBuild could not create or connect to a task host with runtime "CLR2" and architecture "x86".

    vs2010 and vs2012 are installed on target machine. Build c# project using vs2010, following error oc ...

  9. ubuntu的syslog为空,停止写入解决方法

    修改syslog权限: chown syslog:adm syslog

  10. Redis和Memcache的区别分析 [转]

    1. Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别. 2. Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构 ...