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
輸入正確後,得到了下面的檔案。