1.创建数据库Person

CREATE TABLE Person(
id number,
name nvarchar2(200) ,
age number ,
sex nvarchar2(200) ,
password nvarchar2(200)
)

2.在数据库建立一个type,对应JAVA端要传入的对象结构:

   CREATE OR REPLACE TYPE BUT_UKBNOV_CTC_ORDER_REC1 AS OBJECT (
id number,
name nvarchar2(200) ,
age number ,
sex nvarchar2(200) ,
password nvarchar2(200) )

 3.为了数组传输,建立一个数组类型的type:

CREATE OR REPLACE TYPE BUT_UKBNOV_CTC_ORDER_TAB AS TABLE OF BUT_UKBNOV_CTC_ORDER_REC1

4,建立存储过程做插入工作:

   create or replace procedure bulkInsertCTDORDER(i_orders IN BUT_UKBNOV_CTC_ORDER_TAB)
as
ctcOrder BUT_UKBNOV_CTC_ORDER_REC1;
begin
FOR idx IN 1..i_orders.COUNT LOOP
ctcOrder:=i_orders(idx);
INSERT INTO person
(id,
name,
age,
sex,
password
)
VALUES
(ctcOrder.id,
ctcOrder.name,
ctcOrder.age,
ctcOrder.sex,
ctcOrder.password
);
end loop;
exception when others then
raise;
end;

5,建立JAVA端java bean对象

package me.person;

public class Person {
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private int id;
private String name;
private int age;
private String sex;
private String password;
}

6.在JAVA端访问存储过程插入数据,需要做JAVA数据类型和存储过程类型type的映射,下面的StructDescriptor是mapping Oracle端AS OBJECT类型,
tabDesc 是mapping Oracle端数组 AS TABLE OF类型的.

package me.arrayinsertbatch;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List; import org.springframework.stereotype.Service; import me.person.Person;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;
@Service("insertbatchservive")
public class ArraybatchInsertFromExcel {
public void insertbatchfromexcel() throws Exception//10万条11秒
{
double begin = System.currentTimeMillis();
Connection con = null;
CallableStatement cstmt = null;
try {
con = ArrayInsertBatch.getConn();
List<Person> orderList = new ArrayList<Person>(); for(int i=0;i<100000;i++){
Person per=new Person();
per.setId(i);
per.setName("InsertName"+i);
per.setPassword("insertpassword"+i);
per.setSex("男");
per.setAge(i);
orderList.add(per);
}
//JSONArray json=JSONArray.fromObject(orderList);
//System.out.println(json.toString());
StructDescriptor recDesc = StructDescriptor.createDescriptor("BUT_UKBNOV_CTC_ORDER_REC1", con);
ArrayList<STRUCT> pstruct = new ArrayList<STRUCT>();
for (Person ord:orderList) {
Object[] record = new Object[5];
record[0] = ord.getId();
record[1] = ord.getName();
record[2] = ord.getAge();
record[3] = ord.getSex();
record[4] = ord.getPassword();
// JSONArray json1=JSONArray.fromObject(record);
// System.out.println(json1.toString());
//System.out.println(record[4].toString());
STRUCT item = new STRUCT(recDesc, con, record);
pstruct.add(item);
}
//JSONArray json2=JSONArray.fromObject(pstruct);
// System.out.println(json2.toString());
ArrayDescriptor tabDesc = ArrayDescriptor.createDescriptor("BUT_UKBNOV_CTC_ORDER_TAB", con);
ARRAY vArray = new ARRAY(tabDesc, con, pstruct.toArray()); //JSONArray json=JSONArray.fromObject(pstruct.toArray());
// System.out.println(json.toString());
cstmt = con.prepareCall("{call bulkInsertCTDORDER(?)}");
cstmt.setArray(1, vArray);
//cstmt.setString(2, SYSJ);
// cstmt.setString(4, QYSJ);
cstmt.execute();
con.commit();
double time = (System.currentTimeMillis() - begin) / 1000;
System.out.println("插入共花费时间" + time + "s"); }
catch(Exception ex)
{ throw ex;
}
}
}

上面的示例在插入10万条记录只用了11秒

通过数组方式向Oracle大批量插入数据(10万条11秒)的更多相关文章

  1. MySQL大批量插入数据

    MySQL大批量插入数据 1. 对于Myisam类型的表,可以通过以下方式快速的导入大量的数据. ALTER  TABLE  tblname  DISABLE  KEYS; loading  the  ...

  2. MyBatis在Oracle中插入数据并返回主键的问题解决

    引言:  在MyBatis中,希望在Oracle中插入数据之时,同一时候返回主键值,而非插入的条数... 环境:MyBatis 3.2 , Oracle. Spring 3.2   SQL Snipp ...

  3. 使用mybatis向oracle数据库插入数据异常

    遇到了使用mybatis向oracle数据库插入数据异常的问题, 具体的报错如下:org.springframework.jdbc.UncategorizedSQLException: ### Err ...

  4. oracle批量插入数据(测试)

    做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条 SQL快速生成大量的测试数据的方法.产生测试数据的SQ ...

  5. Mvc+Dapper+存储过程分页10万条数据

    10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程) 有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下: 技术:Mvc ...

  6. 【转】Oracle中如何用一条SQL快速生成10万条测试数据

    转自http://blog.csdn.net/welken/article/details/4971887   做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入, ...

  7. oracle无法插入数据

    最近遇到一个问题,本来插入数据好好的,突然都不能插入了. 报错------------------->ora-01653:表无法通过128(在表空间)扩展 原因是表满了!!! 解决方案: 1. ...

  8. Oracle快速插入数据append

    1:用merge into 进行匹配更新和插入,2: 开启并行,提高速度3: 如果可以的话加NOLOGING 不写入日志4:如果数据有规律的话,分批次执行 1.使用marge快速插入; MERGE / ...

  9. Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名

    Oracle数据库,用mybatic批量插入数据: <insert id="saveBatch" parameterType="io.renren.entity.N ...

随机推荐

  1. Spring整合Hibernate--声明式事务管理

    Spring指定datasource 1. 新建jdbc.properties文件: jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc: ...

  2. java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

    java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种 ...

  3. 转载:ionic+nodejs开发遇到的跨域和post请求数据问题

    转载自:http://www.cnblogs.com/ytu2010dt/p/5471366.html 最近学习ionic+nodejs开发混合app中遇到了一些问题,在此总结一下. 项目地址 htt ...

  4. 函数之局部变量和使用global语句

    局部变量当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的.这称为变量的 作用域 .所有变量的作用域是它们被定义的块,从它们的名称被定义 ...

  5. android gridview画分割线

    dongyangzhang android gridview画分割线,如图: 1.先上图: 2.具体实现代码: public class LineGridView extends GridView { ...

  6. Post data using ajax in laravel 5

    转自:http://www.tuicool.com/articles/2u2mmmu Post data using ajax in laravel 5 to controller If you ar ...

  7. display属性及inline-block值(可用来布局)

    display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度缺省是它的容器的100%,除非设定一个宽度 <div& ...

  8. HDU1429 bfs

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  9. 【转】安卓布局:layout_weight的理解

    android:layout_weight详细分析介绍: 布局文件是:<?xml version="1.0" encoding="utf-8"?>& ...

  10. UVa 341 - Non-Stop Travel

    题目大意:给一个地区的地图,上面有若干路口,每个路口因为红灯的缘故要耽误一些时间,给出起点和终点,找出最短路径使得耽误时间最短. 单源最短路问题,Dijkstra算法.同时还要打印路径. #inclu ...