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. 【bzoj3670】: [Noi2014]动物园 字符串-kmp-倍增

    [bzoj3670]: [Noi2014]动物园 一开始想的是按照kmp把fail算出来的同时就可以递推求出第i位要f次可以跳到-1 然后把从x=i开始顺着fail走,走到fail[x]*2<i ...

  2. php代码审计7审计csrf漏洞

    跨站请求伪造,也有人写出xsrf,黑客伪造用户的http请求,然后将http请求发送给存在csrf的网站,网站执行了伪造的http请求,就引发了跨站请求伪造 漏洞危害:攻击者盗用了你的身份信息,以你的 ...

  3. 搭建jumpserver堡垒机

    环境 系统: CentOS 7 IP: 192.168.244.144 关闭 selinux 和防火墙 # CentOS 7 $ setenforce 0  # 可以设置配置文件永久关闭 $ syst ...

  4. Django 学习:为窗体加上防机器人的验证机制(验证码功能)

    这里我们使用 django-simple-captcha 模块,官方介绍如下:https://github.com/mbi/django-simple-captcha 一键安装: pip instal ...

  5. C# 使用List<T> 内存溢出

    class Program    {        static void Main(string[] args)        {            var all = new List< ...

  6. 4,JavaScript数据类型

    学习要点:1.typeof 操作符2.Undefined 类型3.Null 类型4.Boolean 类型5.Number 类型6.String 类型7.Object 类型 ECMAScript 中有 ...

  7. js中自己实现bind函数的方式

    最近由于工作比较忙,好久都没时间静下心来研究一些东西了.今天在研究 call 和 apply 的区别的时候,看到 github 上面的一篇文章,看完以后,感觉启发很大. 文章链接为 https://g ...

  8. 【转】 关于IDEA javax.servlet.http.HttpServletRequest; 不存在 解决方案

    昨天从eclipse导入了一个web项目到idea,想运行一下,结果发现 servlet报红... 没有包,第一反应就是eclipse需要设置Targeted Runtimes,但是idea的设置是啥 ...

  9. Ngnix,EA(Enterprise Architect)

    nginx Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点 ...

  10. php-fpm 三种运行模式

    php-fpm配置 配置文件:php-fpm.conf 开启慢日志功能的: slowlog = /usr/local/var/log/php-fpm.log.slowrequest_slowlog_t ...