Oracle通过OCI批量加载需要注意的问题

    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

posted @ 2013-06-03 16:17  Angels-Wing  阅读(755)  评论(0编辑  收藏  举报