`

数组接口(批量插入)研究

阅读更多

数组接口

    数组接口允许你使用数组变量替代标量变量来进行绑定。当特定的DML语句需要插入或更新大量数据的时候,它就会非常有用。在执行DML语句的时候,不再需要针对每条记录分别执行一次,而可以将所有必要的值组合进一个数组然后仅仅需要执行一次即可,如果纪录的数量太大,也可以将执行操作拆分成小一点的批次。结果,到数据库的往返次数将与执行次数的数量成比例地下降。

必须强调的是,没有应用批量处理时加载的低性能并不是数据库引擎导致的,而是应用程序本身导致并反过来又受其拖累。

尽管数组接口对客户端来讲更加有效,数据库也能从中收益,事实上,数组接口降低了逻辑读的数量。

 

下面将提供一些关于如何在PL/SQLOCIJDBCODP.NET中使用数组接口的基本信息。

1.PL/SQL

 PL/SQL中,可以使用FORALL语句来应用数组接口。在执行一个DML语句的时候,可以利用它来将数据绑定成数组传递给数据库引擎。示例代码如下:

 

DECLARE

  TYPE t_id IS TABLE OF t.id%TYPE;

  TYPE t_pad IS TABLE OF t.pad%TYPE;

  l_id t_id := t_id();

  l_pad t_pad := t_pad();

BEGIN

  -- prepare data

  l_id.extend(100000);

  l_pad.extend(100000);

  FOR i IN 1..100000

  LOOP

    l_id(i) := i;

    l_pad(i) := rpad('*',100,'*');

  END LOOP;

  -- insert data

  FORALL i IN l_id.FIRST..l_id.LAST

    INSERT INTO t VALUES (l_id(i), l_pad(i));

END;

 

需要特别注意的是,尽管这个语法是基于关键字FORALL的,但这不是一个循环。所有的纪录都是在一次数据库调用中发送过去的。 

2.JDBC

JDBC中,可以使用批量更新来使用数组接口(在一次执行操作中插入10万条记录)。例如代码如下:

 

sql = "INSERT INTO t VALUES (?, ?)";

statement = connection.prepareStatement(sql);

for (int i=1 ; i<=100000 ; i++)

{

     statement.setInt(1, i);

     statement.setString(2, "****************************************************************************************************");

     statement.addBatch();

 }

 statement.executeBatch();

 statement.close();

3.ODP.NET

ODP.NET中,只要定义好基于数组的参数,并将属性ArrayBindCount设置为存储在数组中的值的个数,就可以应用数组接口了。下面的代码片段展示了这一点,它在一次执行操作中插入了10万条记录。

 

            Decimal[] idValues = new Decimal[100000];

            String[] padValues = new String[100000];

 

            for (int i=0 ; i<100000 ; i++)

            {

                idValues[i] = i;

                padValues[i] = "******************************************************************************************";

            }

 

            id = new OracleParameter();

            id.OracleDbType = OracleDbType.Decimal;

            id.Value = idValues;

 

            pad = new OracleParameter();

            pad.OracleDbType = OracleDbType.Varchar2;

            pad.Value = padValues;

 

            sql = "INSERT INTO t VALUES (:id, :pad)";

            command = new OracleCommand(sql, connection);

            command.ArrayBindCount = 100000;

            command.Parameters.Add(id);

            command.Parameters.Add(pad);

            command.ExecuteNonQuery();

 

分享到:
评论

相关推荐

    android 批量插入联系人短信通话记录

    批量插入时,你可以先创建一个`ContentValues`数组,然后在一个循环中依次插入。 接下来是批量插入短信。在Android 4.4以后,系统对短信操作进行了严格的限制,非系统应用无法直接写入短信数据库。但可以通过使用...

    易语言源码易语言QEHashTableV3源码.rar

    8. **优化策略**:为了提高性能,开发者可能对哈希表的某些操作进行了优化,如预计算哈希值、批量插入等。 深入学习这个源码,你可以了解到易语言中的数据结构实现、算法运用以及优化技巧,对于提升易语言编程能力...

    matlab学习笔记.pdf

    11. 批量处理Excel数据:可以使用MATLAB的Excel接口(如`xlsread`函数)读取Excel数据,将其导入矩阵,然后进行处理。对于大量数据,可以使用循环结构批量处理。 总的来说,MATLAB提供了丰富的功能来处理数值计算、...

    javacollection.zip_Java编程_Java_

    ArrayList基于动态数组,适合随机访问,插入和删除较慢;而LinkedList基于双向链表,适合顺序访问和频繁的插入删除。 2. **Set接口**:Set接口不允许有重复元素。HashSet是最常见的实现,它不保证元素的顺序,且...

    epoll_socket.zip

    1. **效率更高**:epoll使用红黑树存储文件描述符,插入、删除和查找操作的时间复杂度都是O(logn),而select和poll则使用数组,当文件描述符数量大时性能下降明显。 2. **内存效率**:epoll支持边缘触发(ET)和水平...

    cpp-一个Python列表替换针对同类集合进行了优化

    标题中的"cpp"通常指的是C++,一种广泛使用的面向对象编程语言,而"Python...同时,对于Python到C++的转换,可以研究Python的C API或使用如PyBind11这样的库来创建Python接口,使得C++代码能无缝地与Python代码交互。

    collectionJava源码-jcf-reading:JavaCollectionFramework源代码阅读。分析设计与实施

    总之,深入研究`collectionJava源码-jcf-reading`将对提升Java程序员对JCF的理解,提升编程技巧,以及优化程序性能等方面产生积极影响。这个项目不仅提供了理论知识,还通过实际代码展示了如何在实践中应用这些概念...

    odbc.rar_labview_labview数据导入_数据_数据库

    LabVIEW支持将数组数据转换为适合SQL语句的格式,以便批量导入。 在实际操作中,可能还需要处理数据预处理、错误处理、事务管理等问题。例如,如果数据需要预处理或清洗,可以使用LabVIEW的数据处理工具,如“查找...

    五子棋代码oracle

    本项目“五子棋代码oracle”是基于Oracle数据库实现的,这为我们提供了研究如何将游戏逻辑与数据库存储、查询相结合的机会。下面将详细讨论这个项目中涉及的关键知识点。 1. **Oracle数据库**: Oracle是世界上最...

    DButils 的源代码

    3. **批处理支持**:DButils 提供了批处理接口,可以方便地进行多条 SQL 批量执行,提高数据插入和更新的效率。 4. **异常处理**:DButils 封装了 JDBC 的异常,提供了统一的异常处理机制,简化了错误处理流程。 5...

    .NET技术学习大纲

    最后,掌握如何高效地批量插入大量数据到数据库。 #### 第三部分:.Net高级技术 - **高级特性**:了解多项目开发的流程,深入研究CLR(公共语言运行时)、CTS(公共类型系统)、CLS(公共语言规范)、IL(中间语言...

    Labview数据库操作范例VI

    首先,Labview提供了多种数据库接口,例如ODBC(Open Database Connectivity)和ADO.NET(ActiveX Data Objects .NET),允许开发者与SQL Server、Oracle、MySQL、SQLite等众多数据库系统进行通信。在这些范例中,你...

    MySQL源码结构解析

    用于批量插入操作,提高写性能。 - **lock**:InnoDB的锁实现。包括行级锁和表级锁,用于实现事务的隔离级别。 - **log**:日志缓冲(Log Buffer)和重做日志组(Redo Log)的实现。用于确保事务的持久性。 - **mem*...

    jogl简单入门例子,15个例子,JOGL1.0,2.0的jar包

    OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D、3D图像,广泛应用于游戏开发、科学可视化以及工程应用等领域。 标题提到的"jogl简单入门例子"是针对初学者的一系列教程或示例代码,帮助快速理解和上手JOGL。...

    超简单实用的C#编写的日常事务管理工具源码(本人编写)

    它支持类、接口、继承、多态等面向对象特性,并且拥有强大的垃圾回收机制,使得内存管理更加简便。 在这个日程管理工具中,我们可能会看到以下几个关键知识点: 1. **Windows Forms**:作为C#中的GUI库,Windows ...

    Java容器之Hashtable源码分析

    - `putAll`:从另一个`Map`对象批量插入所有映射。 【删除key-value相关方法】 - `remove(key)`:根据键移除对应的键值对。 - `remove(key, value)`:如果键值对的键和值都匹配,则移除该键值对。 【查找key-...

    PHP实例开发源码——AB自动发卡平台源码.zip

    熟悉变量、条件语句、循环、数组、字符串操作以及文件I/O等基本概念是必不可少的。 2. **数据库交互** AB自动发卡平台必然涉及数据库操作,如MySQL。PHP可以通过PDO(PHP Data Objects)或mysqli扩展与数据库进行...

    2021-2022计算机二级等级考试试题及答案No.10520.docx

    - **题目描述**:在CSS文件中正确插入注释的方式。 - **答案解析**:CSS注释采用`/* 注释内容 */`的形式。这种形式的注释不会被解析器解析,也不会影响样式的表现,是一种良好的代码注释习惯,便于维护和阅读。 #...

    精易模块[源码] V5.15

    8、新增“数组_取次数”,取指定数组成员出现相同数量,源码由易友【C盘是头猪】提供。 9、修正“进程_ID取进程名”在64位系统不能获取名称的BUG,感谢易友【慕寒夜】反馈。 10、新增“进程_取线程数”通过进程ID或...

Global site tag (gtag.js) - Google Analytics