oracle11g批量insert多条,Oracle高效批量插入数据

2023-05-16

一、准备工作

建表

CREATE TABLE TEMP_20200210

(

DMC VARCHAR2(100);

)

用程序拼接如下的批量插入的SQL

INSERT INTO TEMP_20200210 (DMC)

SELECT CD.* FROM

(

SELECT 1234567 FROM DUAL UNION

SELECT 1234568 FROM DUAL UNION

SELECT 1234568 FROM DUAL

) CD

在C盘文件夹下放一个1.txt文件目录为C:\1.TXT 里面的内容如下。里面有大约150万行数据,36M左右

c61458dabdd02beb0f78cd25d51d80a6.png

2a4c698f6eca7a5861919617b87ef3da.png

二、实践

直接上代码,需要引入oracle的包。

package connect;

import java.io.BufferedReader;

import java.io.FileReader;

import java.io.IOException;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

public class oracle {

//数据库连接对象

private static Connection conn = null;

private static String driver = "oracle.jdbc.driver.OracleDriver"; //驱动

private static String url = "jdbc:oracle:thin:@//ip:1521/orcl"; //连接字符串 ip替换成实际ip地址

private static String username = "globalb"; //用户名

private static String password = "globalb"; //密码

// 获得连接对象

private static synchronized Connection getConn(){

if(conn == null){

try {

Class.forName(driver);

conn = DriverManager.getConnection(url, username, password);

} catch (ClassNotFoundException e) {

e.printStackTrace();

}catch (SQLException e) {

e.printStackTrace();

}

}

return conn;

}

//执行查询语句

public void query(String sql, boolean isSelect) throws SQLException{

PreparedStatement pstmt;

try {

pstmt = getConn().prepareStatement(sql);

//建立一个结果集,用来保存查询出来的结果

ResultSet rs = pstmt.executeQuery();

while (rs.next()) {

String name = rs.getString("DMC");

System.out.println(name);

}

rs.close();

pstmt.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

public void query(String sql) throws SQLException{

PreparedStatement pstmt;

pstmt = getConn().prepareStatement(sql);

pstmt.execute();

pstmt.close();

}

//关闭连接

public void close(){

try {

getConn().close();

} catch (SQLException e) {

e.printStackTrace();

}

}

//执行查询语句

public static void insert(List list) throws SQLException{

Statement pstmt;

String sql ="INSERT INTO IPAM.TEMP_20200210 (DMC) SELECT CD.* FROM ("; //SELECT 1234567 FROM DUAL UNION

for(int i= 0;i

sql = sql+"SELECT "+list.get(i)+" FROM DUAL UNION ";

}

sql = sql.substring(0, sql.length()-6);

sql=sql+")CD";

//System.out.println(sql);

try {

pstmt = getConn().createStatement();

//建立一个结果集,用来保存查询出来的结果

pstmt.executeQuery(sql);

pstmt.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

public static void main(String[] args) throws SQLException, IOException{

Long a = System.currentTimeMillis();

FileReader fileReader =new FileReader("C:\\1.txt");

BufferedReader bufferedReader =new BufferedReader(fileReader);

StringBuilder stringBuilder =new StringBuilder();

List strings =new ArrayList<>();

String str=null;

while ((str=bufferedReader.readLine())!=null) {

//System.out.println(str);

if (str.trim().length()>2) {

strings.add(str);

}

}

System.out.println("total:"+strings.size());

List l = strings;

if(l.size()>0){

if(l.size()<=2000){//每次只插入2000条数据,ORACLE插入字符串不能大于32k

insert(l);

}else{

int times = (int)Math.ceil(l.size()/2000.0 );

for(int i=0; i

insert(l.subList(i*2000, Math.min((i+1)*2000, l.size())));

System.out.println("执行第"+(i+1)+"次");

}

}

}

Long b = System.currentTimeMillis();

System.out.println("耗时:"+(b-a)+"ms");

}

}

三、运行结果

efefdb7bb9eebfb66df61b6aef7461bb.png

282秒大约4.7分钟左右。

f46b9e53c09f7a1164e53d1fee2b4f3c.png

四、总结

以上工作的数据库环境为oracle11g rac ,java版本为java8。

操作系统为windows 2012R2 。

中心思想为分段批量插入,核心代码是网上找的,原文是使用mybatis批量向oracle中插入数据。

if(l.size()>0){

if(l.size()<=2000){//每次只插入2000条数据,ORACLE插入字符串不能大于32k

insert(l);

}else{

int times = (int)Math.ceil(l.size()/2000.0 );

for(int i=0; i

insert(l.subList(i*2000, Math.min((i+1)*2000, l.size())));

}

}

}

当然也可以扩展为插入多列数据,只需要修改读数据的地方和插入的SQL即可。

原文:https://www.cnblogs.com/CryOnMyShoulder/p/12294102.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

oracle11g批量insert多条,Oracle高效批量插入数据 的相关文章

  • java.sql.SQLException: - ORA-01000: 超出最大打开游标数

    我收到 ORA 01000 SQL 异常 所以我有一些与之相关的疑问 最大打开游标是否与 JDBC 连接数完全相关 或者它们也与我们为单个连接创建的语句和结果集对象相关吗 我们正在使用连接池 有没有办法配置数据库中语句 结果集对象的数量 如
  • 如何从vb.net插入两个表

    我想将两个值插入到我创建的 SQL 数据库的两个表中 在我的 vb net 代码中 我的问题是 如果我插入它 它会被插入 但仅在一张表中 否则有时它不会进入内部 这是我使用过的代码 c TextBox1 Text sh TextBox2 T
  • 物化视图中完全刷新和快速刷新有什么区别?

    我在自己的模式中有物化视图 物化视图源是另一个模式表 但是 这个主表有 900 行 我在这个主表上做了一些 dml 操作 之后我将刷新这个物化视图 正如你所知 我做了一些研究 我如何刷新我自己的物化视图 它说 你可以进行完全刷新或快速刷新
  • Oracle 11g XE - 突然出现 ORA-01034: ORACLE 不可用且 ORA-27101: 共享内存领域不存在

    Windows 7 32 位笔记本电脑 Oracle 11g XE 的本地实例 首先 在提出问题之前 我自己一直在研究这个问题 虽然有很多参考 建议 但我无法自己解决这个问题 突然 当我尝试登录本地 Oracle 11g XE 爱好者实例时
  • ORACLe PROCEDURE - AUTHID 仅允许在模式级别

    在尝试通过过程创建表时 我遇到了类似的错误 错误 73 9 PLS 00157 仅在架构级程序上允许 AUTHID PROCEDURE BCKUP AUTHID CURRENT USER AS statusmsg VARCHAR2 400
  • 表与视图的性能

    最近开始使用一个数据库 其中的惯例是为每个表创建一个视图 如果您假设表和视图之间存在一对一的映射 我想知道是否有人可以告诉我这样做对性能的影响 顺便说一句 这是在 Oracle 上的 假设问题是关于非物化视图 实际上取决于视图所基于的查询以
  • Oracle SQL - 如何使用 RANK() 或 DENSE_RANK() 和 ROW_NUMBER() 分析函数获取不同的行?

    我希望获得每个部门前 3 名不同的薪资 我能够使用RANK or DENSE RANK or ROW NUMBER 但我的表有一些工资相同的记录 下面提到的是我的查询及其结果 20部薪资前三名应该是6000 3000 2975 但是有 2
  • 从MySQL插入查询中获取新记录主键ID?

    假设我正在做一个 MySQLINSERT进入我的一张桌子 该桌子有一列item id设置为autoincrement and primary key 如何让查询输出新生成的主键的值item id在同一个查询中 目前我正在运行第二个查询来检索
  • 在 PL/SQL 块中定义引用其自身集合的记录类型

    如何在 PL SQL 匿名块中定义包含自身集合属性的记录类型 看下面的例子 DECLARE type t item is record name varchar2 64 children t items referencing t item
  • 如何查看授予其他用户的架构哪些权限

    考虑这种情况 在数据库中 我有两个用户 A 和 B 及其相应的架构 我想知道 如何获取信息 架构 B 中的用户 A 有哪些权限 考虑这种情况 我们有两个用户及其关联的场景 我们有用户A和用户B 在A中 假设我们有TB1 TB2 在B中 假设
  • 如何在没有可用行选择器的情况下为 APEX 21.1 REST 数据源设置数据配置文件

    我正在使用 APEX 21 1 并为 Web 服务创建了一个 REST 数据源 该服务以以下格式返回响应 1499040000000 A time stamp 0 01634790 A value etc 1499040000100 A t
  • 在 Oracle 过程中实现多线程

    我正在研究 Oracle 10gR2 这是我的问题 我有一个程序 我们称之为 proc parent 在包内 应该调用另一个过程 让我们调用它 用户创建 我得打电话 用户创建 在一个循环中 它从表中读取一些列 并且这些列值作为参数传递给 用
  • 尝试在 Oracle 11.2.0.2.0(64 位)中获取连接时出现 java.lang.ArithmeticException

    我目前正在 Oracle 中使用 Java 存储过程 并且在尝试在 Java 代码中获取连接时看到一些奇怪的行为 我的Java被打包成jar文件 然后使用以下命令部署到Oracle中loadjava命令行实用程序 Apackage然后在数据
  • 如何记录更改列 DDL 操作

    我需要创建一个数据库触发器来记录每个更改 Add Column Modify Column Drop Column 使用Oracle的模式触发器在特定表中执行语句 如何获得 到目前为止我尝试了下面的代码 TRIGGER after ddl
  • Oracle 中的函数与过程

    Oracle 中函数和过程的主要区别是什么 如果我可以用函数完成所有事情 为什么我必须使用过程 如果我无法在sql语句中调用过程 好吧 我会编写一个函数来完成相同的工作 过程不返回值 好的 在任何 dml 操作后我将仅返回 sql rowc
  • ActiveRecord oracle_enhanced 适配器无法加载 ruby​​-oci8 库

    rails g scaffold失败 但 oci 脚本和 irb 数据查询有效 无法弄清楚出了什么问题 rails g scaffold table field1 integer field2 string invoke active re
  • Oracle存储过程使用数组作为表插入的参数

    我一直在寻找一个明显的例子 但没有运气 抱歉 如果已经回答了 我正在尝试做一些非常简单的事情 一个存储过程 它将获取输入并将它们插入到表中 我希望它获取多行数组并一次全部插入 我认为这很简单 但我还没有找到一个可以展示我的例子 在很多例子中
  • TOAD 将 &String 视为绑定变量

    我正在使用 Oracle Data Integrator 开发一些 ETL 有时会使用 TOAD 测试部分代码 今天我遇到了 TOAD 的问题 我有一行像 AND column value like DEV PROD 当我尝试运行包含上面过
  • FROM 子句中的嵌套括号是否有效的 Oracle SQL 语法?

    此查询使用正确的 Oracle 语法吗 select from dual a where a dummy X 它可以在 11g 和 12c 中运行 但它是真正有效的语法吗 或者这只是一个编译器 错误 将来可能会修复 导致代码失败 我怀疑这是
  • ORA-12154: TNS: 无法解析指定的连接标识符 (PLSQL Developer)

    我需要使用 PLSQL Developer 访问 oracle 数据库 当我尝试连接到数据库时出现以下错误 ORA 12154 TNS could not resolve the connect identifier specified 我

随机推荐