传统的在执行多行DML(INSERT、UPDATE、DELETE)时,我们是多次调用executeUpdate();注意!当我们调用一次此函数时,则执行一次网络往返,当数据量大时则效率非常低。不过 OCCI 提供了一种在单个网络往返中发送多行数据的高效机制。此为迭代修改。

使用addIteration()方法实现迭代

  1. 调用setMaxIterations(int maxIterations)方法设置最大迭代次数
  2. 如果参数内存为可变的,如: string、Bytes,则调用setMaxParamSize(int paramenterIndex, int maxParamSize)方法设置参数占用内存的大小以便OCCI内部能分配充足的内存
  3. 调用setXXX()方法为绑定变量设置参数
  4. 在要迭代时调用addIteration()方法
  5. 最后调用executeUpdate()方法执行DML
Environment *env = Environment::createEnvironment();
Connection *conn = env->createConnection();
Statement *stmt = conn->createStatement(sql); stmt->setMaxIterations(2);
stmt->setMaxParamSize(2, 7); stmt->setSQL("INSERT INTO basket_tab VALUES(:1, :2)");
stmt->setString(1, "Apples");
stmt->setInt(2, 6); stmt->addIteration(); //增加迭代 stmt->setString(1, "Oranges");
stmt->setInt(1, 4); stmt->executeUpdate(); //执行

使用setDataBuffer()executeArrayUpdate()方法实现迭代

在讲解此方法之前我们先要明白:当我们在参数化语句中通过setXXX()方法为绑定参数提供数据时,这些值将被复制到内部数据缓冲区中,然后将内部数据缓冲区中数据提供给数据库服务器进行DML处理。为了减少复制用户缓冲区中可用的字符串类型数据的开销,我们可以使用此方法实现性能提升。

void setDataBuffer(int paramIndex,
void *buffer,
Type type,
sb4 size,
ub2 *length, //每个数据长度,不是指缓冲区大小,通常用数组指定每个数据长度
sb2 *ind = NULL,
ub2 *rc = NULL); `paramIndex`: 参数下标
`buffer`: 包含数据的缓冲区地址, 数据缓冲区可能为一维数组或二维数组
`type`: 数据类型,OCCI提供了一个枚举
`size`: 数据大小,不是指缓冲区大小
`length`: 每个数据长度,不是指缓冲区大小,通常用数组指定每个数据长度
`ind`: 指示器信息。表示数据是否为空。对于参数化语句,值为-1表示要插入空值。对于从可调用语句返回的数据,值为-1表示检索空数据。
`rc`: 返回码。此变量对于`Statement`方法没用,但是,对于从可调用语句返回的数据,返回码指定特定于参数的错误号。
Status executeArrayUpdate(unsigned int arrayLength);
`arrayLength`: 迭代次数

Example:

Statement *stmt = conn->createStatement(
"insert into departments (department_id, department_name) values(:1, :2)"); char dnames[][100] = {"Community Outreach", "University Recruiting"};
ub2 dnameLen[2]; for (int i = 0; i < 2; i++)
dnameLen[i] = strlen(dnames[i] + 1); int ids[2] = {7369, 7654};
ub2 idLen[2] = {sizeof(ids[0]), sizeof(ids[1])}; stmt->setDataBuffer(1, ids, OCCIINT, sizeof(ids[0]), idLen);
stmt->setDataBuffer(2, dnames, OCCI_SQLT_STR, sizeof(dnames[0]), dnameLen); stmt->executeArrayUpdate(2); // data for two rows is inserted.

OCCI的迭代修改的更多相关文章

  1. C++通过迭代修改字符串本身(auto类型说明符)

    以字符串这种支持 for (declaration : expression) statement 这样for语句迭代的数据结构为例,我们看看auto关键字在类型推断中的作用. string s = ...

  2. ArrayList迭代修改抛出ConcurrentModificationException

    extends:http://www.cnblogs.com/dolphin0520/p/3933551.html Iterator<Integer> iterator = list.it ...

  3. Java并发编程:同步容器

    Java并发编程:同步容器 为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch). ...

  4. ReactNative新手学习之路03真机调试

    React Native新手入门03真机调试(iOS) 从设备访问开发服务器 在启用开发服务器的情况下,你可以快速的迭代修改应用,然后在设备上查看结果.这样做的前提是你的电脑和设备必须在同一个wifi ...

  5. ReactNative真机运行指南

    ReactNative真机运行指南 注意在iOS设备上运行React Native应用需要一个Apple Developer account并且把你的设备注册为测试设备.本向导只包含React Nat ...

  6. ReactNative真机运行运行

    注意在iOS设备上运行React Native应用需要一个Apple Developer account并且把你的设备注册为测试设备.本向导只包含React Native相关的主题. 译注:从XCod ...

  7. 转:java多线程--同步容器

    java同步容器 在Java的集合容器框架中,主要有四大类别:List.Set.Queue.Map.List.Set.Queue接口分别继承了Collection接口,Map本身是一个接口.注意Col ...

  8. hadoop 2.2.0的datanode中存储block的多个文件夹的负载均衡问题

    hadoop的分布式文件系统HDFS的存储方式是,将数据分成block,分布式存储在整个hadoop集群的datanode中,每个block默认的大小是64M,这些block文件的具体存储位置是在ha ...

  9. play framework2.5.

    play framework2 的学习笔记 https://github.com/playframework/playframework https://github.com/playframewor ...

随机推荐

  1. [转]jquery插件创建 jquery.fn.extend与jquery.extend

    本文转自:http://www.cnblogs.com/wyjgreat/archive/2011/07/19/2110754.html jQuery为开发插件提拱了两个方法,分别是: JavaScr ...

  2. android shape.xml 属性详解

    转载源:http://blog.csdn.net/harvic880925/article/details/41850723 一.简单使用 刚开始,就先不讲一堆标签的意义及用法,先简单看看shape标 ...

  3. (转)Python字典实现三级菜单

    Python字典实现三级菜单 原文:https://www.cnblogs.com/pyramid1001/p/5803294.html 1 ############################# ...

  4. C++ 虚函数、纯虚函数、虚继承

    1)C++利用虚函数来实现多态. 程序执行时的多态性通过虚函数体现,实现运行时多态性的机制称爲动态绑定:与编译时的多态性(通过函数重载.运算符重载体现,称爲静态绑定)相对应. 在成员函数的声明前加上v ...

  5. OC与JS交互之UIWebView

    随着H5的强大,hybrid app已经成为当前互联网的大方向,单纯的native app和web app在某些方面显得就很劣势.关于H5的发展史,这里有一篇文章推荐给大家,今天我们来学习最基础的基于 ...

  6. FTL(FreeMarker)基础

    FreeMarker标签使用一.FreeMarker模板文件主要有4个部分组成1.文本,直接输出的部分2.注释,即<#--...-->格式不会输出3.插值(Interpolation):即 ...

  7. Orcal笔记3-DDL-DML

    一.Oracle的支持数据类型     1.字符串类型         char  固定长度(定义时即已确定长度,空余位置被补全),最大长度255,如 name char(10),'中'会占用10个长 ...

  8. Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令

    Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中. 利 ...

  9. 初看Mybatis 源码 (一)

    Mybatis 的使用,首先需要构建一个SqlSessionFactory 实例.而该实例可以通过SqlSessionFactoryBuilder来创建. String resource = &quo ...

  10. 探讨下在Delphi里面进程之间的数据共享

    进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元.现在小编就和大家来探讨一下在Delphi ...