zoukankan      html  css  js  c++  java
  • Oracle通过OCI批量加载需要注意的问题 Angels

        ORACLE调用接口(Oracle Call Interface简称OCI)提供了一组可对ORACLE数据库进行存取的接口子例程(函数),通过在第三代程序设计语言(如C语言)中进行调用可达到存取ORACLE数据库的目的。OCI就是为了实现高级语言访问数据库而提供的接口。OCI允许开发者在程序里使用SQL和PL/SQL来访问数据库。开发者可以使用第三代语言来编写程序,而使用OCI来访问数据库。
    OCI是由一组应用程序开发接口(API)组成的,ORACLE提供API的方式是提供一组库。这组库包含一系列的函数调用。这组函数包含了连接数据库、调用SQL和事务控制等。在安装DBMS SERVER或者客户端的时候,就安装了OCI。
        根据Oracle公司的介绍:OCI是如此可靠,以至于Oracle数据库中的每一条SQL语句都通过OCI来执行。当应用程序开发人员需要面向Oracle数据库服务器的最强大的接口时,他们将调用 Oracle调用接口(OCI)。OCI提供了对所有Oracle数据库功能的最全面的访问。OCI API中包含了最新的性能、可伸缩性和安全性特性。

      采用OCI的最大好处就是:它是最切近Oracle底层的技术,因此,效率是最高的。同时,它是跨平台的。因此,在我给出的ORADBI库,除了OCI之外,没有其他外部依赖,稍加改动,就可以移植到非Windows平台上或其他嵌入式平台。

      然而,OCI也比较不容易使用。它的功能之强,粒度之细,语法之烦琐,都不适合今天熟悉了快速开发模式的人员使用。然而,OCI的高效,直接根植于数据库核心,跨平台的语言特性,是其他如OO4O、OLEDB、ADO等COM方式不具备的。

    下面就从之前一段时间参与SN数据库集群中间件开发的实践中积累的一点经验,分享如下:

    1.支持的类型 char , unsigned char, int, double,float,long ,char*

    大部分类型直接调用接口不会出什么问题,但是char*尤其需要注意,容易出现乱码。

    2.加载的流程大致如下:

    建立连接-》准备sql statement -》 绑定数据-》excute-》commit

    对于字符串数据的加载的,需要采用三维数组,表中字符串类型的列数为一维,行数为第二维,每个字段的长度为第三维。

    三维数组的变量声明必须与excute的调用在同一个作用域内,否则,execute的时候,三维数组的所在的内存可能已经被重新分配,execute读取绑定数据便会出现乱码。

    此处比较容易出错,虽然execute并没有显示的调用绑定的数据变量,但是内部实现确实读取绑定变量的数据批量加载到数据库中。此处不注意,容易导致加载数据变成乱码。并且此错误是偶发性错误,不是每次运行都会出现,毕竟内存分配是随机的。

    3.加载NULL字段。

    批量加载的接口都是逐列加载某种类型的数据,并且保证各列之间通过位置保证一行数据的对应关系,那么如果一列数据中有NULL字段又该如何呢?

    OCI接口中也是支持NULL数据加载的,是通过indicator(指示器)实现的。indicator是一个指针,类型是sb2,可以指向一个字段,也可以指向一列字段。在绑定接口:OCIBindByPos(stmthp,&bindhp,errhp,1, (dvoid *)&aa,4, SQLT_INT, (void*)&indicator, NULL, NULL,0,0,0); 作为参数传入,其元素数目与绑定的数据列表aa的元素数目相等。位置一一对应。indicator对应位置为-1

    的表示写入NULL,>=0表示写入数据列表aa中的值。

    下面是官方文档中,对指示器使用的介绍。

    1.加载,数据写入NULL:

    Input

    For input host variables, the OCI application can assign the following values to an indicator variable:

    Table 2-7 Input Indicator Values

    Input Indicator ValueAction Taken by Oracle

    -1

    Oracle assigns a NULL to the column, ignoring the value of the input variable.

    >=0

    Oracle assigns the value of the input variable to the column.

     2.查询,数据读取NULL:

    Output

    On output, Oracle can assign the following values to an indicator variable:

    Table 2-8 Output Indicator Values

    Output Indicator ValueMeaning

    -2

    The length of the item is greater than the length of the output variable; the item has been truncated. Additionally, the original length is longer than the maximum data length that can be returned in the sb2 indicator variable.

    -1

    The selected value is null, and the value of the output variable is unchanged.

     

    0

    Oracle assigned an intact value to the host variable.

    >0

    The length of the item is greater than the length of the output variable; the item has been truncated. The positive value returned in the indicator variable is the actual length before truncation.

    Indicator Variables for Named Data Types and REFs

    参考文献:

    1.OCI安装部署以及常用的OCI函数介绍

    http://www.cnblogs.com/joeblackzqq/archive/2011/04/24/2026461.html

    2. OCI读取单条记录

    http://www.cnblogs.com/joeblackzqq/archive/2011/04/26/2028847.html

    3.OCI写入NULL

    http://blog.csdn.net/spche/article/details/6195322

  • 相关阅读:
    Linux下静态库与动态库
    通过js操作样式(评分)
    javascript学习
    2017年6月1日学习
    javascript学习2
    javascript学习:闭包和prototype原型使用基础
    关于“System.Data.ProviderIncompatibleException”类型的异常
    Android性能优化之ViewStub
    Activity Threa创建Window和View分析
    软键盘触发后弹起底部布局文件方法
  • 原文地址:https://www.cnblogs.com/qianxun/p/3115645.html
Copyright © 2011-2022 走看看