江西有色金属  2006, Vol. 20 Issue (4): 38-40
文章快速检索     高级检索
基于OCCI技术的Oracle9i数据库应用程序开发方法探讨[PDF全文]
刘小生 , 李映东     
江西理工大学,江西 赣州 341000
摘要:首先介绍了基于OCCI技术的Oracle9i应用程序的建立方法,然后详细探讨了OCCI开发环境的建立和使用OCCI链接和操纵数据库的方法。
关键词OCCI    Oracle9i    PL/SQL    元数据    
The Discussion of Development Method of Oracle9i Data-base Application Program Based on OCCI-technology
LIU Xiao-sheng , LI Ying-dong     
Jiangxi University of Science and Technology, Ganzhou 341000, Jiangxi, China
Abstract: This paper, firstly, introduced the construction method of Oracle9i data-base application program based on occi-technology, and then discussed particular the construction of occi development environment and the method of using occi link and control data-base.
Key words: OCCI    racle9i    PL/SQL    etadata    
0 引言

Oracle C++调用接口(Oracle C++ Call Interfaces,简称OCCI)是在C++中访问Oracle数据库的一组应用程序接口(API),它被设计成一系列封装很好的类和接口,在Oracle9i中开始引入,它是Oracle 8i提供的OCI(Oracle Call Interfaces)的升级版。OCCI可以使C++应用程序充分利用Oracle数据库的全部操作,包括SQL语句处理和对象操作,它完全支持SQL和PL/SQL的执行;能够满足数目不断递增的用户和请求服务的可升级性;可以像操纵C++类的实例一样,操纵用户自定义类型的对象;能访问和操纵数据库的元数据。OCCI对OCI实现了对象级的封装,它以动态链接库的形式提供给用户,而且容易使用,因此它具有越来越多的客户群。

Oracle是以高级结构化查询语言(SQL)为基础的大型关系数据库,ORACLE公司自1979年推出基于SQL标准的关系数据库产品到2003年版本10g的推出,ORACLE数据库以其支持大数据库、多用户的高性能事务处理,对业界各项工业标准的支持,完整的安全和完整性控制,支持分布式数据库和分布处理,具有可移植性、可兼容性和可连接性等突出优点倍受用户喜爱。

基于Oracle的数据库应用程序开发方法众多,常用方法有:使用开放数据库连接(Open Database Connectivity,简称ODBC)、使用Oracle Provider for OLEDB,ActiveX数据对象(ADO)、使用数据访问对象(DAO)、使用ORACLE Objects for OLE(0040)、Oracle Java数据库连接接口(JDBC)、使用PRO*C、使用OCI/OCCI等。其中,开放数据库连接(ODBC)以前为程序员开发基于Oracle数据库应用程序方法的首选,但由于ODBC速度比较慢等原因,往往造成连接Oracle的稳定性不好;而ADO作为高级数据库接口,不支持Oracle数据对象的访问,如空间数据在Oracle中的对象表达,就无法通过ADO访问。针对此情况,基于OCCI编程接口开发了Oracle数据库应用程序,并应用在赣州市城市规划管理信息系统中。

1 使用OCCI链接和操纵数据库 1.1 OCCI应用程序的开发过程

可以像编译和链接非数据库应用程序一样编译和链接OCCI应用程序,图 1说明了OCCI应用程序的开发过程。

图 1 OCCI应用程序的开发过程

其中,OCCI头文件包括occi.h、occiCommon.h、occiControl.h、occiData.h、occiObjects.h。OCCI库文件包括libocci.so / libocci.a / oraocci10.dll。

Oracle支持多种第三方编译器。链接OCCI程序的方法因系统的不同而有所不同。在某些系统中,可能除了要使用OCCI库外,还需要一些其他的库文件才能链接生成OCCI应用程序。

1.2 OCCI控制类之间的关系

OCCI控制类之间的关系见图 2所示。

图 2 OCCI─控制类之间的关系

1.3 OCCI应用程序的初始化

一个OCCI应用程序通过创建一个Environment类的实例来初始化,所有OCCI处理都是在OCCI的Environment类中进行的。OCCI环境提供了多种应用程序模式和用户指定的内存管理功能。一个Environment类的实例确定了以下内容:应用程序的模式、对象缓存设置和OCCI类的内存堆。其中,应用程序的模式包括对象模式、线程模式和互斥模式等。创建Environment的实例是建立数据库连接的基础,通过调用Environment类的静态方法createEnvironment来创建Environment类的实例,调用te rminateEnvironment方法来销毁实例。值得一提的是,OCCI使用createxxx方法创建的对象都必须显示地进行销毁。

1.4 建立和关闭数据库连接

一个用户的数据库连接是用一个Connection类的实例来表达的,Environment类是创建Connection对象实例的加工厂,它首先创建一个Environment的实例;其次调用这个实例的静态方法createConnection建立和数据库的连接;然后调用Environment实例的terminateConnection方法关闭数据库连接。通过Connection对象实例可以访问数据、执行SQL语句、处理数据库对象。Connection还支持许多高级的机制如连接池、会话池、代理认证等。

1.5 执行SQL语句和PL/SQL程序块

SQL是与关系数据库交互的全行业的标准语言。在OCCI应用程序里,使用Statement类来执行DDL/DML语句、ELECT查询、PL/SQL程序块和存取程序输出结果。用ResultSet类来取得SELECT语句查询的结果。Statement对象用于绑定和存取各种数据类型的值的接口一致。数据类型间的转换由OCCI自动处理。

建立数据库连接后,首先调用Connection对象的createStatement方法创建Statement对象,然后调用Statement对象的execute、executeUpdate、executeArrayUpdate或executeQuery方法执行SQL命令或PL/SQL代码。其中execute方法用于执行一般的语句;executeUpdate用于执行DML或DDL语句;executeQuery方法专门用于执行查询语句;executeArrayUpdate用于执行多条DML语句;最后用ResultSet对象来取得SQL命令或PL/SQL代码的执行结果。ResultSet对象的释放通过调用Statement对象的closeResultSet方法来完成,而Statement对象的销毁通过调用Connection对象的terminateStatement方法来完成。

作者根据参考文献[2]中的有关内容组织整理了下面的代码,用来具体说明怎么建立和销毁OCCI环境,怎么打开和关闭数据库连接,以及执行SQL命令。

// OCCI头文件

#include < occi.h>

//创建一个OCCI环境

Environment * env =

Environment::createEnvironment (Environment:: OBJECT);

{

//创建一个数据库链接

Connection* conn =

env->createConnection ("scott","tiger", "");

//创建一个Statement对象

Statement* stmt =

conn->createStatement("SELECT * FROM my-basket");

//执行查询语句,返回查询结果

ResultSet* rs = stmt->executeQuery();

rs->next (); Blob b = rs->getBlob(1);

...

stmt->closeResultSet (rs); //关闭resultset,释放资源

conn ->terminateStatement (stmt);//关闭Statement对象

env->terminateConnection (conn);//关闭数据库链接,释放相关资源

}

Environment :: terminateEnvironment (env); //关闭环境对象

1.6 元数据的访问

数据库对象有各种不同的描述属性,通过对某个特定的模式对象执行DESCRIBE操作,可以获得这个对象的有关信息。这些信息作为一个Metadata类的对象被访问。可以用这种方式访问数据库对象的元数据或查询结果的元数据。Metadta类和它的getxxx方法可以提供数据库对象和查询结果的列的全面属性信息。通过调用Connection类的getMetadata ()方法或ResultSet类的getColumnListMetadata ()方法来取得需要的Metadata对象。

下面的代码说明了对一个模式对象元数据的访问:

// Connection::getMetaData (string &object,ParamType ptype)

MetaData md = conn ->getMetaData ("EMP", PTYPE_UNK);

//返回目标类型

int objectType = md.getInt(MetaData::ATT

下面的代码显示了对一个ResultSet对象元数据的访问:

Statement *stmt = conn->createStatement("sele ct * from emp");

ResultSet *rs = rs->executeQuery();

//每一个向量元素一行

vector < MetaData> selectcols = rs->getColumnListMetaDat(a);

//返回i行的类型

int columnType =selectcols [i].getInt(MetaData:: ATTR_DATA_TYPE)

2 结论

讨论了基于OCCI技术开发Oracle应用程序的基本方法。Oracle C++调用接口(OCCI)是构建在Oracle调用接口(OCI)全部特性的基础之上,是在OCI的基础上设计和实现的,对OCI进行了封装。与OCI相比,OCCI访问Oracle对象类型的接口自然,大大提高了C++程序员开发高性能Oracle数据库应用程序的效率,通过OCCI可以很方便地使应用程序连接到Oracle数据库,执行SQL语句,取回查询结果,以及访问数据库对象的元数据。OCCI是创建高性能和可伸缩Internet应用程序的理想选择。OCCI应用博大精深,需要人们在实际工作中进行不断地学习研究。

参考文献
[1]
孙忠华. 时空过程数据引擎[D]. 武汉: 武汉大学, 2004.
[2]
彭珲, 潘立福, 李冬. 使用OCCI开发Oracle9i数据库应用程序[J]. 电脑编程技巧与维护, 2004(6): 15–18.