1、OTT概念
OTT 是 Object Type Translator 的缩写,对象类型转换器。它是用来将数据库中定义的类型(UDT)转换为C结构体类型的工具。
借助OTT 可以用C语言调用OCI来访问oracle的用户自定义类型(User-defined types)
2、大部分操作系统,都是通过命令行方式调用OTT。
OTT需要一个输入文件 intype ,它会生成一个outtype 文件和一个或者多个c语言头文件以及c文件。
首先看一下调用OTT命令的例子,先有一个整体印象:
ott userid=scott intype=demoin.typ outtype=demoout.typ code=c hfile=demo.h initfile=demov.c
3、准备数据
在数据库中我们首先创建一个自定义类型
CREATE TYPE emptype AS OBJECT ( name VARCHAR2(30), empno NUMBER, deptno NUMBER, hiredate DATE, salary NUMBER );
4、OTT命令详解
4.1 ott 表示ott程序名称
4.2 userid 表示连接数据库的用户名 后续会让输入这个对应的用户名的密码
4.3 intype 表示需要输入的文件名 该文件是由用户创建的
该文件内容需要告诉OTT 那个数据库类型需要被翻译,并且能控制翻译出的c语言对应的结构体名称
如果该参数没有给出,则翻译整个schema下的所有类型。
该文件示例如下:
CASE=LOWER
TYPE employee
TRANSLATE SALARY$ AS salary
DEPTNO AS department
TYPE ADDRESS
TYPE item
TYPE "Person"
TYPE PURCHASE_ORDER AS p_o
- 这里第一行 CASE 关键字,表示生成的c的标识符应该为小写,但是这个关键字只能控制结构体中的成员为小写,其中的结构体名称不变。
- 其他以TYPE 关键字开始的行,表示哪些对象应该被翻译。在上边这个例子中 employee ADDRESS item Person PURCHASE_ORDER 都将被翻译。
- 关键字 TRANSLATE ... AS 指明将被翻译的对象的成员名称在转换到c结构体的时候需要被转换,这里employee类型的SALARY$ 将被翻译为salary
- 关键字AS 表示将该对象名称翻译的时候替换 如PURCHASE_ORDER 将要被翻译为 p_o结构体类型
- 如果没有AS应用于对象或者属性,那么OTT将翻译成符合c标识符的对应的名称,其他不符合c标识符的都将被翻译成字符'_' 。
- OTT 会翻译指定对象所依赖的对象,虽然该对象并不在intype文件中明确指出。比如person 类型下边有一个address类型的属性,那么OTT在翻译person时会一并翻译address
4.4 outtype 表示类型输出文件
该文件由OTT自动生成。这个文件包含了哪些类型被翻译,包括其版本,头文件等信息。
4.5 code 表明翻译的目标语言,有如下几种
C equivalet to ANSI_C
ANSI_C for ANSI C
KR_C for Kernighan & Ritchie C
4.6 HFILE 指明翻译后的头文件的文件名称
4.7 INITFILE 指明翻译后的c文件的文件名称
5、OTT生成文件
OTT执行成功后,会生成3个文件,一个outtype文件,一个c头文件*.h,一个c文件*.c
5.1 outtype 文件
生成的这个文件包含了哪些类型被翻译,以及其详细信息,如下所示
5.2 头文件
比如翻译 employee 这个对象的结果如下
这里,name 被翻译成了 OCIString* 类型 empno 被翻译成了 OCINumber类型,等等。下表就是翻译对应的类型说明
这里除了各个属性被翻译外,还有NULL指示器也一应被翻译。
这里第一个指示器 _atomic 表示指示整个对象是否为空。
5.3 c文件
6、OCI应用使用OTT的步骤及方式
1)在数据库中定义用户类型
2)使用OTT生成头文件和c文件
3)编写OCI应用并调用INITFUNC 函数
4)添加OTT生成的头文件到OCI应用中
5)编译程序(程序本身和OTT生成的C文件以及OCI库)
6)执行程序
如下图所示
参考文档 http://docs.oracle.com/cd/B28359_01/appdev.111/b28395/oci15ott.htm#g455369
7、实际操作
7.1 在数据库中定义的类型如下
7.2 创建文件 addr_type.typ 并执行ott命令
如上图,执行成功后生成了三个新文件,头文件如下所示
c文件
outtype 文件
参考文档 http://docs.oracle.com/cd/B28359_01/appdev.111/b28395/oci15ott.htm#g455369