ORACLE调用接口(OCI)中对象类型转化器(OTT)的使用
2012-04-03 21:26
609 查看
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
输入正确后,得到了下面的文件。
设置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
输入正确后,得到了下面的文件。
相关文章推荐
- Asp.net 面向接口可扩展框架之使用“类型转化基础服务”测试四种Mapper(AutoMapper、EmitMapper、NLiteMapper及TinyMapper)
- Oracle 调用接口 (Orale Call Interface,OCI) 【实现各种语言操作Oracle数据库】简介
- 在.Net中使用Oracle的表类型和对象类型
- oracle 大对象(lob)类型使用性能测试
- hibernate3使用c3p0连接池调用oracle自定义对象问题处理
- Oracle调用接口(OCI)源码剖析(2):执行SQL语句并获取结果
- Oracle 中Java 对象与PL/SQL类型的映射及使用
- [转]在.Net中使用Oracle的表类型和对象类型
- DWR中调用Java对象的方法,不要使用简单数据类型
- Oracle调用接口(OCI)源码剖析(3):关闭数据库连接
- Oracle使用对象类型3(MEMBER方法的对象类型)
- Oracle不支持在select语句中调用自定义函数时使用自定义类型作参数?
- Linux下配置Oracle调用接口OCI及我碰到的一些问题
- TreeSet集合存放自定义类型的对象,可以使用比较器,实现Comparable接口自己设置排序方式
- controller中使用@RequestBody,Java如何传递json对象访问接口,以及对象中的时间类型
- oracle 大对象(lob)类型使用性能测试
- Oracle自定义数据类型 2 (调用对象方法)
- C++ 转换类型运算符 调用构造函数将变量转化成为一个对象的成员变量
- Oracle 中Java 对象与PL/SQL类型的映射及使用
- The DataDirect provider for Oracle调用存储过程使用Cursor类型参数