`
binyan17
  • 浏览: 204204 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

[转]jdbc批量insert———oracle数组类型与forall的应用

 
阅读更多

原文:http://blog.itpub.net/post/37572/465011

测试java的insert 同使用9i以后的bulk Insert 的速度.
测试结果显示通过bulk Insert 速度相当的快.
100000条记录
insert ,---------------93秒
bulk insert -------------0.441秒

环境:
oracle 10.2.0.3 Windows 2000Server 
java


代码:

 

SQL> desc a
Name Type Nullable Default Comments 
---- ------------ -------- ------- -------- 
ID INTEGER Y 
NAME VARCHAR2(20) Y
bulk Insert 使用的类型及过程
create or replace type i_table is table of number(10);
create or replace type v_table is table of varchar2(10);
create or replace procedure pro_forall_insert(v_1 i_table,v_2 v_table)
as
c integer;
begin

forall i in 1.. v_1.count 
insert into a values(v_1(i),v_2(i));
end;
 

 

测试的java代码:

import java.io.*;
import java.sql.*;
import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.*;
import oracle.jdbc.OracleTypes;
import oracle.sql.*;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;
import java.sql.Connection;
import java.sql.DriverManager;
import oracle.jdbc.OracleCallableStatement;

public class testOracle
{
    public testOracle()
    {
        Connection oraCon = null;
        PreparedStatement ps = null;
        Statement st = null;
        ResultSet rs = null;
        try
        {
            try
            {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            }
            catch (ClassNotFoundException ex)
            {
            }
            oraCon = DriverManager.getConnection("jdbc:oracle:thin:@192.168.15.234:1521:ora10g",
                    "imcs",
                    "imcs");
            oraCon.setAutoCommit(false);
        }
        catch (SQLException ex)
        {
            ex.printStackTrace();
        }
        CallableStatement cstmt = null;
        oracle.sql.ArrayDescriptor a = null;
        oracle.sql.ArrayDescriptor b = null;
        if (1 == 1)
        {
            Object[] s1 = new Object[100000];
            Object[] s2 = new Object[100000];
            for (int i = 0; i < 100000; i++)
            {
                s1[i] = new Integer(1);
                s2[i] = new String("aaa").concat(String.valueOf(i));
            }
            try
            {
                a = oracle.sql.ArrayDescriptor.createDescriptor("I_TABLE",
                        oraCon);
                b = oracle.sql.ArrayDescriptor.createDescriptor("V_TABLE",
                        oraCon);
                ARRAY a_test = new ARRAY(a, oraCon, s1);
                ARRAY b_test = new ARRAY(b, oraCon, s2);
                cstmt = oraCon.prepareCall("{ call pro_forall_insert(?,?) }");
                cstmt.setObject(1, a_test);
                cstmt.setObject(2, b_test);
                long aaaa = System.currentTimeMillis();
                System.out.println(System.currentTimeMillis());
                cstmt.execute();
                oraCon.commit();
                System.out.println(System.currentTimeMillis() - aaaa);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
        else
        {
            try
            {
                PreparedStatement oraPs = null;
                String oraInsertSql = "insert into a values(?,?)";
                oraPs = oraCon.prepareStatement(oraInsertSql);
                long aaaa = System.currentTimeMillis();
                System.out.println(System.currentTimeMillis());
                for (int i = 0; i < 100000; i++)
                {
                    oraPs.setInt(1, i);
                    oraPs.setString(2,
                            new String("aaa").concat(String.valueOf(i)));
                    oraPs.executeUpdate();
                }
                oraCon.commit();
                System.out.println(System.currentTimeMillis() - aaaa);
            }
            catch (SQLException ex)
            {
                System.out.print("dddddd");
                System.out.print(ex.getMessage());
            }
        }
        try
        {
            jbInit();
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
    
    public static void main(String args[])
    {
        testOracle a = new testOracle();
    }
    
    private void jbInit() throws Exception
    {
    }
    
};
 

 

分享到:
评论

相关推荐

    mongdb和oracledb已经access数据的batchInsert操作

    Oracle是一个关系型数据库,它支持通过`BULK COLLECT INTO`和`FORALL`语句实现批量插入。在Java中,可以使用JDBC的`PreparedStatement`对象的`setBatch()`方法来设置一组SQL插入语句,然后调用`executeBatch()`执行...

    springmybatis

    Insert INTO `user` VALUES ('1', 'summer', '100', 'shanghai,pudong'); 到此为止,前期准备工作就完成了。下面开始真正配置mybatis项目了。 1. 在MyBatis 里面创建两个源码目录,分别为 src_user,test_src, 用...

    jdbc连接数据库getConnection 增、删、改、查

    String Driver="oracle.jdbc.driver.OracleDriver"; Connection conn = null; try { Class.forName(Driver); conn = DriverManager.getConnection(url, user, password); } catch (Exception e) { System.out....

    SQLSERVER到ORACLE的数据库迁移

    在进行数据迁移之前,首先需要了解SQL Server与Oracle之间不同类型的数据类型的映射关系。下面是两种数据库管理系统之间的主要数据类型对应关系: | SQL Server Data Type | Oracle Data Type | |-----------------...

    韩顺平玩转oracle学习笔记

    ### 韩顺平玩转Oracle学习笔记知识点详解 #### 一、Oracle基本使用——基本命令 ##### 连接命令 - **`conn[ect]`**:此命令用于连接到Oracle数据库。语法如下: - `conn 用户名/密码@网络服务名 [as sysdba/...

    Oracle通解API

    2. 数据操纵:INSERT、UPDATE和DELETE语句用于插入、修改和删除数据,以及如何使用BULK COLLECT和FORALL进行批量操作。 3. 数据定义:CREATE、ALTER和DROP命令用于创建、修改和删除表、视图、索引、用户和角色等...

    oracle 程序员开发指南

    了解如何正确使用显式和隐式游标,以及如何利用FORALL语句进行批量操作,有助于在处理大数据集时减少资源消耗。 七、数据库安全与权限管理 Oracle提供了丰富的权限和角色机制,确保数据的安全性。理解用户、角色、...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    12.4 与应用特点相匹配的解决方案 348 12.4.1 压缩索引 348 12.4.2 基于函数的索引 350 12.4.3 反转键索引 353 12.4.4 降序索引 354 12.5 管理问题的解决方案 355 12.5.1 不可见索引 355 12.5.2 虚拟索引 ...

    8.JDBC.pdf

    - **JDBC-ODBC桥**:早期的一种驱动类型,现在已经很少使用。 - **部分Java驱动**:依赖于本地代码。 - **纯Java驱动**:完全由Java编写,无需额外的软件支持。 - **网络纯Java驱动**:客户端与服务器之间通过...

    Oracle PL/SQL学习官方教材

    教材还会讲解如何使用BULK COLLECT和FORALL语句进行批量操作,提高效率。 6. **索引和视图**:学习如何创建和管理索引,优化查询性能,以及创建和使用视图来抽象数据库表的复杂性。 7. **包(Package)**:包是PL/...

    java下数据库开发

    在Java下进行Oracle开发,需要了解Oracle的数据类型、表的创建与管理、索引、视图、存储过程以及触发器等基本概念。 三、配置Oracle JDBC驱动 要连接到Oracle数据库,首先需要在项目中引入Oracle JDBC驱动,如ojdbc...

    利用Java向Oracle中插入图片&#40;BLOB&#41;文件.doc

    Class.forName("oracle.jdbc.driver.OracleDriver"); // 获取数据库连接 conn = DriverManager.getConnection("jdbc:oracle:thin:@172.16.225.170:1521:orcl", "scott", "tiger"); } catch ...

    泛微Ecology E9适配人大金仓数据库说明_v3.docx

    * 金仓数据库不支持批量插入insert all语法,解决办法:涉及insert all的内容全部兼容到非oracle数据库的处理逻辑分支下。 * 金仓数据库不支持table()关键字,解决办法:改为执行Mysql数据库类型的处理逻辑,相关...

    Oracle数据库学习日记

    ### Oracle数据库学习知识点详解 #### 一、基本使用 ##### 1.1 常用命令 **1.1.1 Connect/Disconnect 数据库连接命令** - **Connect**: 使用 `connect` 命令可以连接到Oracle数据库。语法通常为 `connect ...

    Jdbc.zip_zip

    JDBC提供了数据库连接、数据查询、数据更新等功能,使得Java应用程序能够与多种类型的数据库进行无缝连接。 在JDBC中,数据库连接通常通过DriverManager类来建立。首先,我们需要在程序中加载相应的数据库驱动,这...

    oracle中建存储过程的具体实现实例(供初学者使用)

    在Java应用程序中,可以使用JDBC(Java Database Connectivity)来调用Oracle中的存储过程。以下是一个简单的示例,展示了如何连接到Oracle数据库并调用存储过程。 ##### 1. 获取数据库连接 ```java import java....

    jdbc基础和参考

    new oracle.jdbc.driver.OracleDriver(); DriverManager.registerDriver(driver); 3.加虚拟机参数jdbc.drivers -Djdbc.drivers=oracle.jdbc.driver.OracleDriver 4.从Jdk6.0以后要求,JDBC 4.0 Drivers ...

    JSP+Oracle简便通用的表单数据存储处理方法文章出处

    使用 JDBC 连接 Oracle 数据库,并根据操作类型执行相应的 SQL 语句。常见的操作有插入(Insert)、更新(Update)、删除(Delete)等。 - **插入操作**: ```java String sql = "INSERT INTO table_name (id, ...

    mybatis中批量插入的两种方式(高效插入)

    MyBatis是一个强大的持久层框架,它允许开发者编写SQL查询,使用存储过程,并进行高级映射,无需手动处理JDBC代码和结果集的封装。在处理大量数据时,批量插入是一种提高性能的有效策略。本文将深入探讨MyBatis中...

    JSP通过JDBC驱动各种数据库方法

    JDBC是Java平台上的一个标准API,它允许Java程序与各种类型的数据库进行交互,包括Oracle、MySQL、SQL Server等。JDBC提供了一组接口和类,用于建立数据库连接、执行SQL语句以及处理查询结果。 要使用JDBC,我们...

Global site tag (gtag.js) - Google Analytics