プライマリ・コンテンツに移動
Pro*C/C++プログラマーズ・ガイド
12c リリース1(12.1)
B71397-03
目次へ移動
目次
索引へ移動
索引

前
次

OTT参照

OTTの動作を制御するパラメータは、OTTコマンドラインでもCONFIGファイル内でも指定できます。また、一部のパラメータは、INTYPEファイルにも指定できます。この項では、次の項目について詳しく説明します。

この章では、次の規則を使用してOTTの構文を説明します。

OTTコマンドライン構文

OTTコマンドライン・インタフェースは、OTTを明示的に起動してデータベース型をC構造体に変換するときに使用します。このインタフェースは、オブジェクトを活用するOCIアプリケーションまたはPro*C/C++アプリケーションの開発に必須です。

OTTコマンドライン文は、キーワードOTTと、その後に続くOTTパラメータのリストによって構成されます。

OTTコマンドラインの文で指定できるパラメータは、次のとおりです。

   [USERID=username/password[@db_name]]
   [INTYPE=in_filename]
   OUTTYPE=out_filename
   CODE={C|ANSI_C|KR_C}
   [HFILE=filename]
   [ERRTYPE=filename]
   [CONFIG=filename]
   [INITFILE=filename]
   [INITFUNC=filename]
   [CASE={SAME|LOWER|UPPER|OPPOSITE}]
   [SCHEMA_NAMES={ALWAYS|IF_NEEDED|FROM_INTYPE}]
   [TRANSITIVE=TRUE|FALSE]

注意:

通常、OTTコマンドの後に続くパラメータはどのような順序でもよく、常に必須となるのはOUTTYPEおよびCODEパラメータのみです。

HFILEパラメータは、ほとんどの場合に使用されます。省略すると、INTYPEファイルのそれぞれの型について、個別にHFILEを指定する必要があります。OTTがINTYPEファイルで指定されていない型を変換する必要があると判断すると、エラーがレポートされます。したがって、INTYPEファイルが以前にOTT OUTTYPEファイルとして生成されている場合のみ、HFILEパラメータを省略できます。

INTYPEファイルを省略すると、スキーマ全体が変換されます。詳細は、次の項のパラメータの説明を参照してください。

次にOTTコマンドライン文の例を示します(1行に入力します)。

OTT userid=scott/tiger intype=in.typ outtype=out.typ code=c hfile=demo.h errtype=demo.tls case=lower

OTTコマンドラインの各パラメータについて、この後の各項で説明します。

OTTパラメータ

OTTコマンドラインにパラメータを入力するときの書式は、次のとおりです。

parameter=value

parameterはリテラル・パラメータ文字列で、valueは有効なパラメータ設定値です。リテラル・パラメータ文字列は大/小文字を区別しません。

コマンドラインのパラメータは、空白またはタブのいずれかを使用して区切ります。

また、パラメータは構成ファイル内でも指定できます。ただし、この場合、行の中に空白を入れることはできないため、各パラメータは独立した行に指定する必要があります。さらに、パラメータCASEHFILEINITFUNCおよびINITFILEは、INTYPEファイルに入れることができます。

USERID

USERIDパラメータでは、Oracleユーザー名およびパスワード、オプションのデータベース名(Oracle Netのデータベース指定文字列)を指定します。データベース名を省略すると、デフォルトのデータベースが使用されます。このパラメータの構文は、次のとおりです。

USERID=username/password[@db_name]

これが第1パラメータの場合は、「USERID=」を省略して、次のように指定できます。

OTT username/password...

USERIDパラメータはオプションです。省略した場合、OTTは自動的にユーザーCLUSTER$usernameでデフォルトのデータベースへの接続を試みます。usernameは、ユーザーのオペレーティング・システムのユーザー名です。

INTYPE

INTYPEパラメータでは、オブジェクト型指定のリストの読取り元ファイルの名前を指定します。読み取ったリストにある型が、OTTによって変換されます。このパラメータの構文は、次のとおりです。

INTYPE=filename

USERIDが第1パラメータ、INTYPEが第2パラメータで、USERID=を省略した場合は、INTYPE=も省略できます。INTYPEが指定されていない場合は、ユーザーのスキーマにおけるすべての型が変換されます。

OTT username/password filename...

INTYPEファイルは、型宣言に対するMakeファイルとみなすことができます。C構造体宣言の必要な型をリストします。INTYPEファイルの書式については、INTYPEファイルの構造体で説明します。

コマンドラインまたはINTYPEファイルのファイル名に拡張子が含まれていない場合は、「TYP」や「typ」などのプラットフォーム固有の拡張子が追加されます。

OUTTYPE

OTTによって処理されるすべてのオブジェクト・データ型の型情報が書き込まれるファイルの名前を指定します。これには、INTYPEファイルで明示的に指定したすべての型が含まれます。さらに、変換対象である他の型の宣言で使用しているために変換された型が含まれる場合もあります(TRANSITIVE=TRUEの場合)。このファイルは、それ以後にOTTを起動するときにINTYPEファイルとして使用できます。

OUTTYPE=filename

INTYPEパラメータとOUTTYPEパラメータが同一のファイルを参照している場合、INTYPEファイルの古い情報は、新しいINTYPEの情報に置き換えられます。これは、型の変更から始まり、型宣言の生成、ソースコードの編集、プリコンパイル、コンパイル、デバッグに至るサイクル内で、同一のINTYPEファイルを繰返し使用するときに便利です。

OUTTYPEは必ず指定します。

コマンドラインまたはINTYPEファイルのファイル名に拡張子が含まれていない場合は、「TYP」や「typ」などのプラットフォーム固有の拡張子が追加されます。

CODE

CODE= C|KR_C|ANSI_C

OTTの出力を表すホスト言語です。CODE=CCODE=KR_CまたはCODE=ANSI_Cのいずれかを指定できます。「CODE=C」は、「CODE=ANSI_C」と等価です。

このパラメータは、デフォルト値がないので必ず指定する必要があります。

INITFILE

INITFILEパラメータでは、OTTで生成した初期化ファイルを書き込むファイルの名前を指定します。このパラメータを省略すると、OTTは初期化関数を生成しません。

Pro*C/C++プログラムの場合、必要な初期化はSQLLIBランタイム・ライブラリによって実行されるため、INITFILEは必要ありません。OCIプログラムのユーザーは、INITFILEファイルをコンパイルおよびリンクし、環境ハンドルの作成時に初期化関数をコールする必要があります。

コマンドラインまたはINTYPEファイルで指定したINITFILEファイル名に拡張子を付けなかった場合は、「C」または「.c」のようなプラットフォーム固有の拡張子が追加されます。

INITFILE=filename

INITFUNC

INITFUNCパラメータは、OCIプログラムのみで使用します。OTTで生成する初期化関数の名前を指定します。このパラメータを省略すると、INITFILEの名前から初期化関数の名前が付けられます。

INITFUNC=filename

HFILE

INTYPEファイルに記述した型の宣言でインクルード(.h)ファイルを指定しなかった場合に、OTTによって生成されるインクルード・ファイルの名前を指定します。INTYPEファイルで各型のインクルード・ファイルを個々に指定していない場合は、このパラメータが必要です。また、INTYPEファイルに記述していない型を、2つ以上の異なるファイルで宣言されている他の型で使用する場合(TRANSITIVE=TRUEの場合)は、INTYPEファイルに記述していない型も生成する必要があります。そのような場合もこのパラメータが必要です。

コマンドラインまたはINTYPEファイルで指定したHFILEファイル名に拡張子を付けなかった場合、「H」や「.h」のようなプラットフォーム固有の拡張子が追加されます。

HFILE=filename

CONFIG

CONFIGパラメータでは、共通に使用されるパラメータ指定を含むOTT構成ファイルの名前を指定します。また、パラメータ指定は、プラットフォームによって異なる位置にあるシステム構成ファイルから読み込まれます。残りのすべてのパラメータ指定は、コマンドラインまたはINTYPEファイルで指定する必要があります。

CONFIG=filename 

注意: CONFIGパラメータは、CONFIGファイルでは使用できません。

ERRTYPE

このパラメータを指定すると、INTYPEファイルのリストが、すべての情報メッセージおよびエラー・メッセージとともにERRTYPEファイルに書き込まれます。情報メッセージおよびエラー・メッセージは、ERRTYPEを指定したかどうかに関係なく、標準出力に送信されます。

実質的に、ERRTYPEファイルはエラー・メッセージが追加されたINTYPEファイルのコピーです。ほとんどの場合、エラー・メッセージには、エラーの原因となったテキストへのポインタが含まれます。

コマンドラインまたはINTYPEファイルのERRTYPEファイル名に拡張子が付いていない場合は、「.TLS」または「.tls」など、プラットフォーム固有の拡張子が追加されます。

ERRTYPE=filename

CASE

このパラメータでは、OTT生成の特定のC言語の識別子を大文字で表記するか小文字で表記するかを指定します。CASEの可能な値は、SAMELOWERUPPERおよびOPPOSITEです。CASE = SAMEの場合は、データベース型と属性名をC識別子に変換するときに、大/小文字は変更されません。CASE=LOWERの場合、大文字はすべて小文字に変換されます。CASE=UPPERの場合、小文字はすべて大文字に変換されます。CASE=OPPOSITEとすると、大文字はすべて小文字に変換され、小文字はすべて大文字に変換されます。

CASE=[SAME|LOWER|UPPER|OPPOSITE]

このパラメータは、INTYPEファイルに記述されていない識別子(明示的にリストされていない属性または型)のみに作用します。大/小文字の変換は、正当な識別子が生成された後で行われます。

注意:

INTYPEで特定された型のC言語の構造体識別子の大/小文字の区別は、INTYPEファイルにおける大/小文字と同じです。たとえば、INTYPEファイルに次の行が含まれる場合、

TYPE Worker

OTTによって次のように生成されます。

struct Worker {...};

一方で、INTYPEファイルに次のように記述したとします。

TYPE wOrKeR

OTTによって次のように生成されます。

struct wOrKeR {...};

これはINTYPEファイルの大/小文字区別どおりです。

INTYPEファイルに記述されていない、大/小文字の区別のないSQL識別子は、CASE=SAMEの場合は大文字で、CASE=OPPOSITEの場合は小文字で指定します。宣言時に引用符が付かなかったSQL識別子には、大/小文字の区別はありません。

SCHEMA_NAMES

このパラメータでは、デフォルトのスキーマからの型のデータベース名をOUTTYPEファイル内のスキーマ名で修飾する操作を制御できます。OTT生成のOUTTYPEファイルには、型の名前など、OTTの処理対象となる型の情報が含まれています。

詳細は、SCHEMA_NAMESの使用方法を参照してください。

TRANSITIVE

値TRUE(デフォルト)またはFALSEをとります。INTYPEファイルに明示的に指定されていない型の依存性が変換されるかどうかを示します。TRANSITIVE=FALSEを指定すると、INTYPEファイルに指定されていない型は生成されません。これは、他に生成される型の属性の型として使用される場合も同じです。

OTTパラメータの指定可能な場所

OTTのパラメータは、コマンドライン、コマンドラインで指定するCONFIGファイル内、またはその両方で指定します。パラメータの一部は、INTYPEファイルにも指定できます。

OTTは、次のように起動します。

OTT username/password parameters

コマンドラインのパラメータの1つが、

CONFIG=filename

の場合、構成ファイルfilenameからその他のパラメータが読み込まれます。

さらに、パラメータは、プラットフォームによって異なる位置にあるデフォルトの構成ファイルから読み込まれます。このファイルの存在は必要ですが、空でもかまいません。構成ファイルには、各パラメータを1行に1つずつ、空白を使用せずに入力する必要があります。

引数を指定しないでOTTを実行すると、オンラインのパラメータ参照が表示されます。

変換されるOTTの型は、INTYPEパラメータで指定したファイルで命名されます。パラメータCASEINITFILEINITFUNCおよびHFILEは、INTYPEファイルに入れることもできます。OTT生成のOUTTYPEファイルにはCASEパラメータが含まれ、初期化ファイルが生成されている場合はINITFILEおよびINITFUNCパラメータが含まれます。OUTTYPEファイルでは、型ごとにそれぞれHFILEを指定します。

OTTコマンドの大/小文字区別は、プラットフォームによって異なります。

INTYPEファイルの構造

INTYPEおよびOUTTYPEファイルでは、OTTにより変換される型がリストされ、型または属性名の有効なC言語の識別子への変換方法を決定するときに必要なすべての情報が提供されます。これらのファイルには、1つ以上の型指定を記述します。また、次のオプションを指定する場合もあります。

  • CASE

  • HFILE

  • INITFILE

  • INITFUNC

CASEINITFILEまたはINITFUNCオプションを指定する場合は、すべての型指定よりも前に指定する必要があります。これらのオプションをコマンドラインとINTYPEファイルの両方に指定した場合は、コマンドラインの値が使用されます。

単純なユーザー定義のINTYPEファイルと、そのファイルからOTTにより生成される完全なOUTTYPEファイルの例は、OTTでの型の継承のサポートを参照してください。

INTYPEファイルの型指定

INTYPEでの型指定によって、変換するオブジェクト・データ型の名前を指定します。次の記述は、ユーザー作成INTYPEファイルの例です。

TYPE employee
  TRANSLATE SALARY$ AS salary
            DEPTNO AS department
TYPE ADDRESS
TYPE PURCHASE_ORDER AS p_o

型指定の構造は、次のとおりです。

TYPE type_name [AS type_identifier]
[VERSION [=] version_string]
[HFILE [=] hfile_name]
[TRANSLATE{member_name [AS identifier]}...]

type_nameの構文は、次のとおりです。

[schema_name.]type_name

この場合、schema_nameは、指定されたオブジェクト・データ型を所有するスキーマの名前で、type_nameはその型の名前です。デフォルト・スキーマは、OTTを実行するユーザーのスキーマです。デフォルト・データベースは、ローカル・データベースです。

型指定のコンポーネントは、次のとおりです。

  • type nameはオブジェクト・データ型の名前です。

  • type identifierは型を表すために使用されるC言語の識別子です。省略すると、デフォルトの名前マッピング・アルゴリズムが使用されます。詳細は、デフォルト名のマッピングを参照してください。

  • version stringは、OTTの以前の起動によってコードが生成されたときに使用された型のバージョン文字列です。バージョン文字列はOTTによって生成され、OUTTYPEファイルに書き込まれます。このファイルは、後でOTTを実行するときにINTYPEファイルとして使用できます。バージョン文字列はOTTの操作には影響しませんが、最終的にこれを使用して、起動中のプログラムで使用されるオブジェクト型のバージョンが選択されます。

  • hfile nameは、該当する構造またはクラスの宣言が表れるヘッダー・ファイルの名前です。hfile nameを省略すると、宣言の生成時にはコマンドラインのHFILEパラメータで指定したファイルが使用されます。

  • member nameは、次のidentifierに変換される属性(データ・メンバー)の名前です。

  • identifierはユーザー・プログラムの属性を表すために使用されるC言語の識別子です。この方法によって、任意の数の属性に対して識別子を指定できます。指定していない属性については、デフォルトの名前マッピング・アルゴリズムが使用されます。

オブジェクト・データ型は、次のいずれかの場合に変換する必要があります。

  • INTYPEファイルに指定されている場合。

  • 変換が必要な別の型を宣言する場合、およびTRANSITIVE=TRUEの場合は必須です。

明示的に記述していない型があり、その型が、正確に1つのファイルのみに宣言した型で必要だとします。この場合、明示的に記述していない型の変換結果は、それを必要とする明示的に宣言した型と同じファイルに書き込まれます。

明示的に記述していない型があり、その型が、複数の異なるファイルに宣言した型で必要だとします。この場合、要求された型の変換結果は、グローバルなHFILEファイルに書き込まれます。

ネストされたインクルード・ファイル(#include)の生成

OTTによって生成されるすべてのHFILEで、他の必要なファイルが#includesを使用してインクルードされ、そのファイルの名前から組み立てられた記号が#definesを使用して定義されます。この記号は、HFILEがすでにインクルードされているかどうかを判断する場合に使用できます。たとえば、次の型を持つデータベースについて考えます。

create type px1 AS OBJECT (col1 number, col2 integer);
create type px2 AS OBJECT (col1 px1);
create type px3 AS OBJECT (col1 px1);

INTYPEファイルの内容は次のとおりです。

CASE=lower
type pxl
  hfile tott95a.h
type px3
  hfile tott95b.h

OTTを次のように起動するとします。

ott scott/tiger tott95i.typ outtype=tott95o.typ code=c

すると、次の2つのヘッダー・ファイルが生成されます。

ファイルtott95b.hは次のとおりです。

#ifndef TOTT95B_ORACLE
#define TOTT95B_ORACLE
#ifndef OCI_ORACLE
#include <oci.h>
#endif
#ifndef TOTT95A_ORACLE
#include "tott95a.h"
#endif
typedef OCIRef px3_ref;
struct px3
{
   struct px1 col1;
};
typedef struct px3 px3;
struct px3_ind
{
   OCIInd _atomic;
   struct px1_ind col1
};
typedef struct px3_ind px3_ind;
#endif

ファイルtott95a.hは次のとおりです。

#ifndef TOTT95A_ORACLE
#define TOTT95A_ORACLE
#ifndef OCI_ORACLE
#include <oci.h>
#endif
typedef OCIRef px1_ref;
struct px1
{
   OCINumber col1;
   OCINumber col2;
}
typedef struct px1 px1;
struct px1_ind
{
   OCIInd _atomic;
   OCIInd col1;
   OCIInd col2;
}
typedef struct px1_ind px1_ind;
#endif

このファイルでは、TOTT95B_ORACLEという記号を最初に定義しています。そのため、プログラマは、次の構造体を使用してtott95b.hを条件付きでインクルードできます。その場合、tott95b.hがインクルード・ファイルに依存しているかどうかを考慮する必要はありません。

#ifndef TOTT95B_ORACLE
#include "tott95b.h"
#endif

このテクニックを使用すると、「foo.h」などのファイルから「tott95b.h」をインクルードできます。この場合、「foo.h」からインクルードされる他のファイルに「tott95b.h」がインクルードされているかどうかを確認する必要はありません。

記号TOTT95B_ORACLEの定義の後に、ファイルoci.h#includeによってインクルードされます。OTT生成のすべてのHFILEには、Pro*C/C++やOCIのプログラマに役立つ型と関数の宣言が含まれたoci.hが組み込まれます。OTTが#includeにかぎ括弧を使用するのは、この場合のみです。

次に、ファイルtott95a.hがインクルードされるのは、tott95a.hに必要な「struct px1」の宣言が含まれているためです。INTYPEファイルにより型宣言の複数ファイルへの書込みが要求される場合は、OTTにより、その他の各HFILEにインクルードする必要があるファイルが決定され、必要な#includeが生成されます。

この#includeでは、OTTにより引用符が使用されるため注意してください。tott95b.hがインクルードされたプログラムをコンパイルすると、tott95a.hの検索はソース・プログラムの検出位置から開始され、それ以降は実装定義の検索規則に従って実行されます。この方法でtott95a.hが検出されない場合は、INTYPEファイル内で完全ファイル名(/で始まるUNIXの絶対パス名など)を使用して、tott95a.hの位置を指定する必要があります。

SCHEMA_NAMESの使用方法

このパラメータでは、OTTの接続先となるデフォルト・スキーマに含まれる型の名前を、OUTTYPEファイル内のスキーマ名で修飾するかどうかを指定します。

デフォルト・スキーマ以外のスキーマに基づく型の名前は、OUTTYPEファイル内のスキーマ名で常に修飾されます。

スキーマ名で修飾するかしないかで、プログラム実行中に型がどのスキーマで検索されるかが決定します。

次の3通りの設定があります。

  • SCHEMA_NAMES=ALWAYS(デフォルト)

    OUTTYPEファイル内のすべての型名をスキーマ名で修飾します。

  • SCHEMA_NAMES=IF_NEEDED

    デフォルト・スキーマに属するOUTTYPEファイル内の型名はスキーマ名で修飾しません。デフォルト・スキーマ以外のスキーマに属する型名は、スキーマ名で修飾します。

  • SCHEMA_NAMES=FROM_INTYPE

    INTYPEファイルに記述されている型は、INTYPEファイル内のスキーマ名で修飾されている場合にのみ、OUTTYPEファイル内のスキーマ名で修飾されます。デフォルト・スキーマ内の型は、INTYPEファイル内で記述されていなくても型の依存性によって生成する必要がある場合にはスキーマ名付きで記述されます。これは、その型に依存する型としてOTTで最初に検出された型がスキーマ名付きで記述されていた場合にのみ行われます。ただし、OTTが接続しているデフォルト・スキーマにない型は、常に、明示的に指定したスキーマ名付きで記述されます。

OTT生成のOUTTYPEファイルは、Pro*C/C++のINTYPEファイルになります。このファイルは、データベース型名をC言語の構造体名に対応付けます。この情報は、構造体内で正しいデータベース型が確実に選択されるようにするために、実行時に使用されます。OUTTYPEファイル(Pro*C/C++のINTYPEファイル)内のスキーマ名で型が指定される場合、その型はプログラムの実行中に名前付きスキーマ内で検索されます。型がスキーマ名なしで表示される場合、そのファイルはプログラムの接続先となるデフォルト・スキーマ内で検出されます。このデフォルト・スキーマは、OTTで使用されたデフォルト・スキーマと異なる場合があります。

SCHEMA_NAMESFROM_INTYPEを設定し、INTYPEファイルで読み込みます。

TYPE Person
TYPE joe.Dept
TYPE sam.Company

OTTで生成した構造体を使用して、Pro*C/C++アプリケーションでsam.Company、joe.DeptおよびPersonの各型を使用します。Personにはスキーマ名が付いていないので、アプリケーションが接続されているスキーマ内のPerson型を参照します。

OTTとアプリケーションの両方がスキーマjoeに接続すると、アプリケーションではOTTと同じ型(joe.Person)が使用されます。OTTがスキーマjoeに接続しても、アプリケーションがスキーマmaryに接続した場合、このアプリケーションでは型mary.Personが使用されます。この動作が有効なのは、スキーマjoeとスキーマmaryで同じCREATE TYPE Person文が実行された場合のみです。

一方、アプリケーションでは、どのスキーマに接続されているかに関係なく、joe.Dept型が使用されます。この動作のためには、INTYPEファイルに型名とともにスキーマ名を必ず記述する必要があります。

明示的に指定していない型が、OTTによって変換される場合があります。たとえば、次のSQL宣言があるとします。

CREATE TYPE Address AS OBJECT
(
street    VARCHAR2(40),
city      VARCHAR(30),
state     CHAR(2),
zip_code  CHAR(10)
);

CREATE TYPE Person AS OBJECT
(
name      CHAR(20),
age       NUMBER,
addr      ADDRESS
);

ここで、そのOTTがスキーマjoeに接続し、SCHEMA_NAMES=FROM_INTYPEが指定され、ユーザーのINTYPEファイルは次のいずれかを含むとします。

TYPE Person or TYPE joe.Person

joe.Address型が指定されていない場合は、joe.Person型にネストされたオブジェクト型として使用されます。TYPE joe.PersonがINTYPEファイルに記述されている場合は、OUTTYPEファイルにはTYPE joe.PersonとTYPE joe.Addressが表示されます。INTYPEファイルにType Personが記述されている場合は、TYPE PersonおよびTYPE AddressがOUTTYPEファイルに表示されます。

joe.Address型がOTTによって変換された複数の型に埋め込まれていた場合にも、INTYPEファイル内で明示的に指定されていなければ、埋め込まれたjoe.Address型が最初に検出されたときに、スキーマ名を使用するかどうかが決定されます。なんらかの理由で、joe.Address型にはスキーマ名を付け、Person型にはスキーマ名を付けない場合は、次のように明示的に要求する必要があります。

TYPE      joe.Address

これはINTYPE FILEで要求します。

各型を単一のスキーマ内で宣言する通常の場合は、すべての型名をINTYPEファイル内のスキーマ名で修飾することが最も安全です。

デフォルトの名前のマッピング

OTTでオブジェクト型または属性のC識別子名を作成する場合、OTTは、その名前をデータベース・キャラクタ・セットから有効なC識別子に変換します。最初に、名前はデータベース・キャラクタ・セットからOTTで使用するキャラクタ・セットに変換されます。次に、変換した結果の名前がINTYPEファイルに指定されている場合は、その変換内容が使用されます。それ以外の場合、名前はCASEオプションで指定したコンパイラのキャラクタ・セットに1文字ずつOTTにより変換されます。この詳細を次に説明します。

OTTによってデータベース・エンティティ名が読み込まれると、データベース・キャラクタ・セットからOTTで使用するキャラクタ・セットに自動的に変換されます。OTTがデータベース・エンティティ名を正常に読み込むには、その名前のすべての文字がOTTのキャラクタ・セット内で検出される必要はあります。しかし、文字によっては2つのキャラクタ・セット間でエンコーディングが異なる場合があります。

必要な文字がOTTで使用するキャラクタ・セットにすべて含まれていることを保証するには、データベース・キャラクタ・セットと同じものを使用するのが最も簡単な方法です。ただし、OTTのキャラクタ・セットは、コンパイラのキャラクタ・セットのスーパーセットである必要があります。つまり、コンパイラのキャラクタ・セットが7ビットASCIIの場合、OTTのキャラクタ・セットはサブセットとして7ビットASCIIを含む必要があります。コンパイラのキャラクタ・セットが7ビットEBCDICの場合は、OTTのキャラクタ・セットはサブセットとして7ビットEBCDICを含む必要があります。OTTで使用されるキャラクタ・セットを指定するには、環境変数NLS_LANGを設定する方法と、プラットフォーム固有の他のメカニズムを使用する方法があります。

OTTがデータベース・エンティティの名前を読み取ると、その名前は、OTTで使用するキャラクタ・セットからコンパイラのキャラクタ・セットに変換されます。名前の変換がINTYPEファイルで指定されている場合は、OTTはその変換を使用します。

それ以外の場合、OTTは名前を次のように変換します。

  1. 最初に、OTTのキャラクタ・セットがマルチバイト・キャラクタ・セットの場合、その名前にある、等価のシングルバイト文字を持つマルチバイト文字は、シングルバイト文字に変換されます。

  2. 次に、その名前は、OTTのキャラクタ・セットからコンパイラのキャラクタ・セットに変換されます。コンパイラのキャラクタ・セットは、US7ASCIIのように、シングルバイト・キャラクタ・セットです。

  3. 最後に、有効になっているCASEオプションに従って、文字の大/小文字が設定されます。そして、C言語の識別子で無効な文字、またはコンパイラのキャラクタ・セットに変換内容がない文字は、アンダースコアに置き換えられます。1文字でもアンダースコアに置き換えられると、OTTから警告メッセージが表示されます。名前に含まれる文字がすべてアンダースコアに置き換えられると、OTTによってエラー・メッセージが表示されます。

文字単位の名前の変換では、コンパイラのキャラクタ・セットにあるアンダースコア、数字またはシングルバイト文字は変更されません。したがって、有効なC言語の識別子は変更されません。

名前の変換ではたとえば、ウムラウトの付いた「o」、アクセント符号の付いた「a」などのシングルバイト文字をそれぞれ「o」や「a」に変換したり、またマルチバイト文字をシングルバイトと等価に変換できます。名前に等価のシングルバイトがないマルチバイト文字がある場合、通常、その名前の変換はエラーとなります。この場合、ユーザーは、INTYPEファイルで名前の変換を指定する必要があります。

OTTでは、同じC言語の名前に複数のデータベース識別子がマップされたために発生する名前の重複は検出されません。また、データベース識別子がC言語のキーワードにマップされる場合に発生する命名の問題も検出されません。

制限事項

OTTを使用する場合は、次の制限が適用されます。

ファイル名比較

現在、OTTでは、2つのファイルが同じかどうかは、コマンドラインまたはINTYPEファイルでユーザーが指定したファイル名を比較して判断しています。OTTで2つのファイル名が同一のファイルを参照しているかどうかを判別する必要がある場合は、1つの潜在的な問題が生じます。たとえば、OTT生成のファイルfoo.hに、foo1.hに書き込まれた型の宣言と、/private/smith/foo1.hに書き込まれた別の型の宣言が必要な場合、OTTは2つのファイルが同じであれば#includeを1つ、異なっていれば#includeを2つ生成する必要があります。ただし、実際には、OTTでは2つのファイルが異なるものとみなされ、次のように2つの#includeが生成されます。

#ifndef FOO1_ORACLE
#include "foo1.h"
#endif
#ifndef FOO1_ORACLE
#include "/private/smith/foo1.h"
#endif

ファイルfoo1.hとファイル/private/smith/foo1.hが異なっていれば、最初のファイルのみがインクルードされます。ファイルfoo1.hとファイル/private/smith/foo1.hが同じであれば、#includeは重複して記述されます。

そのため、コマンドラインまたはINTYPEファイルでファイルを複数回記述するときは、各記述で正確に同じファイル名を使用する必要があります。