OTT是OCI中访问对象类型数据的一个非常重要的工具,它将数据库中的对象类型或几何对象映射为C语言中的结构体,供OCI程序使用。在所有的支持oracle的操作系统中,OTT工具是以命令行方式工作的。要使用它,我们必须先做一些准备工作。
设置ORACLE_HOME环境变量,我的是C:\app\zxg\product\11.1.0\db_1。
在windows命令行方式下,输入ott,出现下列信息,
OTT使用方法实例:首先,在scott用户下建立类型
CREATE TYPE emp_t AS OBJECT
( name VARCHAR2(30),
empno NUMBER,
deptno NUMBER,
hiredate DATE,
salary NUMBER);
我在本机上是在D盘根目录运行这个程序,在D盘根目录中,创建文件demoin.tpy,在文件里面写入
CASE=LOWER
TYPE emp_t
并保存。输入OTT命令,
D:\>ott userid=scott/tiger intype=demoin.tpy outtype=demoout.tpy code=c hfile=demo.h initfile=demov.c
具体说明是:使用用户名scott和密码tiger连接数据库,将输入文件demoin.tpy中的类型定义转换成C语言中的结构体声明。输出到头文件demo.h(C语言中结构体定义)和demoout.tpy。实现文件demov.c包含了一些用户定义类型转换和初始化的函数信息。
执行这个命令后,由OTT产生的类型输出文件demoout.tpy的内容如下:
CASE = LOWER
INITFILE = demov.c
INITFUNC = demov
TYPE SCOTT.EMP_T AS emp_t
VERSION = "$8.0"
HFILE = demo.h
由OTT产生的头文件demo.h的内容如下:
#ifndef DEMO_ORACLE
# define DEMO_ORACLE
#ifndef OCI_ORACLE
# include <oci.h>
#endif
typedef OCIRef emp_t_ref;
struct emp_t
{
OCIString * name;
OCINumber empno;
OCINumber deptno;
OCIDate hiredate;
OCINumber salary;
};
typedef struct emp_t emp_t;
struct emp_t_ind
{
OCIInd _atomic;
OCIInd name;
OCIInd empno;
OCIInd deptno;
OCIInd hiredate;
OCIInd salary;
};
typedef struct emp_t_ind emp_t_ind;
#endif
由OTT产生的实现文件demov.c如下:
#ifndef OCI_ORACLE
# include <oci.h>
#endif
sword demov(OCIEnv *env, OCIError *err)
{
sword status = OCITypeVTInit(env, err);
if (status == OCI_SUCCESS)
status = OCITypeVTInsert(env, err,
(unsigned char *) "SCOTT", 5,
(unsigned char *) "EMP_T", 5,
(unsigned char *) "$8.0", 4);
return status;
}
一旦OTT完成类型转换,则会针对intype文件中的每一个对象类型,头文件中就包含有对应类型结构体定义,还有一个结构体表示该类型的空指示符。例如,在头文件中,结构体emp_t就表示对象类型emp_t,还有一个对应的指示符结构体emp_t_ind。
这个只是针对C语言的,如果要转换为C++的源文件,那么就必须输入类似于下面的命令:
ott userid=scott/tiger intype=demoin.tpy outtype=demoout.tpy code=cpp hfile=
sdogeometry.h cppfile=sdogeometry.cpp
输入正确后,得到了下面的文件。