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

  1. 这里第一行 CASE 关键字,表示生成的c的标识符应该为小写,但是这个关键字只能控制结构体中的成员为小写,其中的结构体名称不变。
  2. 其他以TYPE 关键字开始的行,表示哪些对象应该被翻译。在上边这个例子中 employee ADDRESS item Person PURCHASE_ORDER 都将被翻译。
  3. 关键字 TRANSLATE ... AS 指明将被翻译的对象的成员名称在转换到c结构体的时候需要被转换,这里employee类型的SALARY$ 将被翻译为salary
  4. 关键字AS 表示将该对象名称翻译的时候替换 如PURCHASE_ORDER 将要被翻译为 p_o结构体类型
  5. 如果没有AS应用于对象或者属性,那么OTT将翻译成符合c标识符的对应的名称,其他不符合c标识符的都将被翻译成字符'_' 。
  6. 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

oracle OTT 学习的更多相关文章

  1. Asp.Net MVC4 + Oracle + EasyUI 学习 序章

    Asp.Net MVC4 + Oracle + EasyUI  序章 -- 新建微软实例 本文链接:http://www.cnblogs.com/likeli/p/4233387.html 1.  简 ...

  2. Oracle RAC学习笔记:基本概念及入门

    Oracle RAC学习笔记:基本概念及入门 2010年04月19日 10:39 来源:书童的博客 作者:书童 编辑:晓熊 [技术开发 技术文章]    oracle 10g real applica ...

  3. Oracle GoldenGate学习之Goldengate介绍

    Oracle GoldenGate学习之Goldengate介绍 (2012-10-02 17:07:27) 标签: 检查点 数据传输 队列 进程 分类: Goldengate Goldengate介 ...

  4. oracle 12c 学习系列(1)–12c初体验

    详见原文博客链接地址: oracle 12c 学习系列(1)–12c初体验

  5. Oracle RAC学习笔记01-集群理论

    Oracle RAC学习笔记01-集群理论 1.集群相关理论概述 2.Oracle Clusterware 3.Oracle RAC 原理 写在前面: 最近一直在看张晓明的大话Oracle RAC,真 ...

  6. Oracle RAC学习笔记02-RAC维护工具集

    Oracle RAC学习笔记02-RAC维护工具集 RAC维护工具集 1.节点层 2.网络层 3.集群层 4.应用层 本文实验环境: 10.2.0.5 Clusterware + RAC 11.2.0 ...

  7. [Oracle]OWI学习笔记--001

    [Oracle]OWI学习笔记--001 在 OWI 的概念里面,最为重要的是 等待事件 和 等待时间. 等待事件发生时,需要通过 P1,P2,P3 查看具体的资源. 可以通过 v$session_w ...

  8. 推荐一个Oracle数据库学习网站

    推荐一个我个人的Oracle数据库学习网站,比较系统性的整理,会持续更新的网站.网址: Oracle基础教程: http://www.oraclejsq.com/article/010100110.h ...

  9. Oracle RMAN 学习:恢复

    Oracle RMAN 学习:恢复 6 rman恢复 Rman中的恢复对应restore,recover Restore,数据修复,利用备份集的数据文件来替换已损坏的数据文件或将其恢复到另外一个位置, ...

随机推荐

  1. SHELL编程之case与函数

    一.case语句概述 使用case语句改写if多分支可以使脚本结构更加清晰.层次分明 针对变量不同取值,执行不同的命令序列 case语句结构如下: case 变量值  in 模式1) 命令序列1 ;; ...

  2. 条目十二《切勿对slt容器的线性安全性又不切实际的依赖》

    条目十二<切勿对slt容器的线性安全性又不切实际的依赖> 这一条目,我想用简短而有力的语句来总结. stl库是为了照顾大多数情况,而不是某一领域,如果在库层次实现线性安全,很大可能是对性能 ...

  3. [POI2007]MEG-Megalopolis 树的dfs序+树状数组维护差分 BZOJ1103

    题目描述 Byteotia has been eventually touched by globalisation, and so has Byteasar the Postman, who onc ...

  4. HDU-2063(二分图匹配模板题)

    过山车Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  5. SPOJ - REPEATS RMQ循环节

    题意:求重复次数最多的重复子串(并非长度最长) 枚举循环子串长度\(L\),求最多能连续出现多少次,相邻的节点往后的判断可以使用\(LCP\)得到值为\(K\),那么得到一个可能的解就是\(K/L+1 ...

  6. while循环、运算符和格式化输出以及编码

    一.while循环 1.while就是当的意思,while指当其后面的条件成立,就执行while下面的代码 写一段代码让程序从0打印到100的程序,每次循环+1. count = 0 while co ...

  7. Oracle下lag和lead分析函数

    [转自] http://blog.csdn.net/thinkscape/article/details/8290894 Lead和Lag分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag) ...

  8. HTML中body内常用标签

    基本标签 <b>加粗</b> <i>斜体</i> <u>下划线</u> <s>删除<s/> <p& ...

  9. Q686 重复叠加字符串匹配

    给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1. 举个例子,A = "abcd",B = " ...

  10. TensorFlow-简单的卷积神经网络

    先弄懂卷积神经网络的原理,推荐这两篇博客:http://blog.csdn.net/yunpiao123456/article/details/52437794   http://blog.csdn. ...