ヘッダーをスキップ

Oracle® Databaseプラットフォーム共通日本語README
10g リリース1(10.1)

 
Go To Table Of Contents
目次

Previous Next

Object Type Translator(OTT)README

原典情報: $ORACLE_HOME/precomp/doc/ott/readme.doc

目次

1 互換性と移行

2 新機能

3 OTTに関するよくある質問

4 修正された不具合

1 互換性と移行

リリース8.x以下のOTTはCで記述されていますが、リリース9.0.1以上のOTTはJavaのみで記述されたユーティリティです。OTTの新機能を使用できるのは、リリース9.x以上のみです。リリース9.0.1以上のOTTはJavaで記述されているため、データベースとの通信にJDBC(Java Database Connectivity)が使用されます。JDBCは、Javaからリレーショナル・データベースに接続するためのJavaインタフェースです。クライアント側CコードのOracle Call Interface(OCI)レイヤーをよく理解している開発者であれば、JDBCがCまたはC++プログラマにとってのOCIと同じ機能と柔軟性を提供することがわかります。Oracleには複数のJDBCドライバが用意されています。Thinドライバは、Oracleがインストールされていないクライアント側で使用するJavaドライバです。OCIドライバ(OCI8およびOCI7)は、Oracleクライアントがインストールされているクライアント側で使用されます。Oracle JDBC Driversの詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。OTTリリース9.0.1には新しいコマンドライン・オプションが用意されているため、接続に使用するJDBCドライバを指定できます。

2 新機能

OCIおよびOCCIでのOTTのすべての機能、使用方法、例の詳細は、それぞれ『Oracle Call Interfaceプログラマーズ・ガイド』および『Oracle C++ Call Interfaceプログラマーズ・ガイド』のOTTの項を参照してください。

2.1 リリース10.1.0.2

*OTTでは、.cppファイル内に生成されたメソッドの後のマーカー内に追加されたユーザー・コードを保持できます。

*このリリースのOTTには、文字列属性をUStringとして生成し、C++クラスにUnicode文字列を保持するためのオプションが用意されています。

*BINARY_FLOAT属性とBINARY_DOUBLE属性は、C構造体にはネイティブのfloatおよびdoubleとして生成され、C++のクラスにはBFloat属性およびBDouble属性として生成されます。

----------------------------
リリース9.2.0以上のOTTでは、事前定義済のマーカーで囲むと、.hファイルと.cppファイルに追加されたユーザー・コードを保持できます。

----------------------------
リリース9.0.1以上のOTTには、URLというパラメータが用意されており、接続先データベースのURLを指定できます。このパラメータの書式は次のとおりです。

URL=url

デフォルト値は、jdbc:oracle:oci8:@です。Thinドライバを指定するには、URL=jdbc:oracle:thin:@host:port:sidと入力します。hostはデータベースが実行中のホストの名前、portはポート番号、sidはOracle SIDです。

----------------------------
Object Type Translator 9.0.1では、OCCIアプリケーションで使用できるように、データベース・オブジェクト型、LOB型およびコレクション型がC++のクラスにマップされます。Oracle 9.0.1には、Oracle C++ Call Interface(OCCI)に記述されたC++ APIインタフェースが用意されています。OCCIの機能の1つは、ナビゲーショナル・アクセスを提供することです。OCCIのナビゲーショナル・アクセス用インタフェースはC++インタフェースであり、SQLを使用せずにオブジェクト・リレーショナル・データにアクセスし、C++オブジェクトとして変更できます。OTT 9.0により、データベース内のSQL型がC++のクラス宣言に変換され、オブジェクトのインスタンス化中にOCCIによりコールされるメソッドもいくつか実装されます。宣言は、OCCIアプリケーションに組込み可能なヘッダー・ファイルに格納され、メソッド実装はOCCIアプリケーションとリンクするC++ソース・コード・ファイルに格納されます。
また、OTTでは、マッピングを環境に登録するための関数が別のファイルに生成されます。C++のクラスを生成するには、C++の生成にのみ使用される他の新規パラメータとともに、既存のCODEパラメータに新規の値CPPを指定する必要があります。詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』のObject Type Translatorに関する章を参照してください。

リリース9.0.1以上のOTTでは、オブジェクトの型の継承がサポートされます。Pro*C/C++ユーザーとOCIユーザー向けに、このリリースのOTTでは、継承される属性の宣言前に、その属性をカプセル化された構造体内で特殊な名前_superを使用して宣言することで、オブジェクト・サブタイプを表すC構造体が生成されるようになりました。また、オブジェクトの置換可能な属性は、インライン化されるのではなくポインタに変換されます。OCCIユーザー向けに、継承型は親の型から導出され、生成されたファイルでは親のreadSQLメソッドおよびwriteSQLメソッドがコールされます。継承のサポートの詳細は、Pro*C/C++、OCIおよびOCCIのマニュアルのOTTに関する章を参照してください。

3 OTTに関するよくある質問

質問: すべてのオプションをコマンドラインで指定するとOTTが動作しますが、CONFIGファイルを使用すると動作しません。何が問題ですか?

CONFIGファイルの形式を慎重にチェックしてください。各オプションはそれぞれ1行に指定する必要があり、行中に空白は使用できません。

質問: INTYPEファイル名を指定するのを忘れましたが、OTTではメッセージが表示されませんでした。なぜですか?

INTYPEファイルを指定しなければ、ユーザーのスキーマ内のすべての型が自動的に変換されます。

質問: オブジェクト型に関してC構造体を手動で記述できないのはなぜですか?

OCIプログラマはオブジェクト型用のC構造体を手動で記述できます。ただし、この方法では誤りが発生しやすくなります。プログラマは、オブジェクト型用の構造体、パラレル・インジケータの構造体および必要な型定義を正確に宣言する必要があります。手動で記述した宣言がOTTで生成される内容と等価でなければ、プログラムは動作しません。Pro*C/C++プログラマの場合はもう1つ問題があり、どの構造体がどのオブジェクト型に使用されるかをPro*C/C++プリコンパイラが判別するには、OTTにより生成されたOUTTYPEファイル(プリコンパイラにとってのINTYPEファイル)が必要です。

質問: OTTではデータベースと同じキャラクタ・セットを使用する必要がありますか?

通常は、そうする必要があります。OTTがデータベース・エンティティの名前を読み取るときに、その名前はデータベースのキャラクタ・セットからOTTで使用されているキャラクタ・セットに自動的に変換されます。その後、名前はOTTで使用されているキャラクタ・セットからCコンパイラのキャラクタ・セットに変換されます。OTTがデータベース・エンティティの名前を正常に読み取るには、名前のすべての文字がOTTのキャラクタ・セットに含まれている必要がありますが、文字のエンコーディングは2つのキャラクタ・セット間で異なっていてもかまいません。

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

質問: INTYPEファイル内で型、属性またはスキーマの名前を引用符で囲む必要があるのは、どのような場合ですか?

INTYPEファイル内では、次の2つの場合に名前を引用符で囲みます。

型、属性またはスキーマの名前が最初の宣言時に引用符で囲まれていた場合、その名前には大/小文字区別があります。その名前をSQL文またはINTYPEファイル内で使用する場合は引用符で囲み、宣言時と同じ大/小文字を使用する必要があります。

型、属性またはスキーマの名前がOTTの予約語の場合は、引用符で囲む必要があります。宣言時に名前が引用符で囲まれていなければ、その名前は大文字で記述します。

質問: OCIプログラムで型バージョン表の初期化が前提となっているのはなぜですか?

Oracle8のリリースでは、それぞれの型のバージョンは1つのみでしたが、将来のOracle8リリースでは1つの型の複数バージョンをサポートできます。型バージョン表の初期化により、OCIプログラムが将来のリリースのOracle8に対して互換となります。OCIプログラマは、OTTで生成される初期化関数の関数プロトタイプを宣言し、その関数をコールする必要があります。

Pro*C/C++プログラムは、初期化関数を明示的にコールしません。これは、Pro*Cランタイム・ライブラリSQLLIBにより型バージョン表が初期化されるためです。

質問: オプションをコマンドラインに再指定することでCONFIGファイル内のオプションをオーバーライドできますか?

はい。オプションを複数箇所に指定すると、コマンドラインで指定した値によりINTYPEファイル内の値がオーバーライドされ、INTYPEファイル内の値によりコマンドラインに指定したCONFIGファイル内の値がオーバーライドされ、コマンドラインで指定した値によりデフォルトのCONFIGファイル内の値がオーバーライドされます。

4 修正された不具合

4.1 OTT 10.1.0で修正された不具合

Bug#2381709    GENERATE ASの使用時にはreadSQL()内でサブクラスを使用する

GENERATE AS句の使用時には、readSQL()ではサブクラスは使用されません。readSQL()関数はREFから確保されたオブジェクトを作成するために使用されるため、この種のオブジェクトにはサブクラスを使用できません。たとえば、生成されるクラスobj1のかわりにサブクラスmyobj1を使用し、コンストラクタとデストラクタを起動するには、生成されるオブジェクトのcppファイルを手動で変更する必要があります。

Bug#2366879    OTTでGENERATE ... AS AND REFSを使用してコンパイルされないコードが生成される

オブジェクトに拡張クラスである別のオブジェクトへの参照があると、OTTではコンパイルされないコードが生成されます。

Bug#1815245    EBCDICプラットフォームの場合、OTTはエラー・メッセージに正しいDBエンティティ名を示す必要がある

エラー・メッセージに埋め込まれるDBエンティティ名について、追加の変換が実行されます。

4.2 OTT 9.2.0で修正された不具合

Bug#2311571    BUG 2187330の修正にはオブジェクト属性が含まれていない

Bug 2187330は、OCCIプログラムにメモリー・リークが発生しないように、OTTで埋込みオブジェクト用のデストラクタ・コードが生成されるというものでした。ただし、この修正では、オブジェクトのネストした表とVARRAYである属性のデストラクタ・コードのみが生成されます。オブジェクト属性があると、デストラクタ・コードは生成されないため、引き続きリークが発生する可能性があります。

Bug#2187330    PTR属性のベクターを含むオブジェクトについてC++デストラクタが生成されない

オブジェクトにオブジェクトのVARRAYまたはネストした表がある場合は、C++デストラクタを生成する必要があります。

これは、対応するC++属性がベクター< whateverobject *>であるためです。ポインタ・メモリーは、オブジェクトが破棄された後もぶら下がったままです。オブジェクトは、分解中にポインタの所有権を引き継いでクリーン・アップする必要があります。

Bug#1913293    readSQLに新規の異なるバージョンを使用する

OTTでは、導出クラスごとに新規の演算子も生成されます(これには、.hファイル内のプロトタイプ生成と.cppファイル内の定義生成が含まれます)。

Bug#1828274    ユーザー・クラスの前方宣言がない

OTTにより生成されたOCCI用C++コードの問題です。ユーザー拡張クラスの前方宣言はありません。

Bug#1828232    埋込みオブジェクトの宣言がコンパイルされない

OTTにより生成された.cppファイルは、拡張埋込みオブジェクト宣言がないためコンパイルされません。

Bug#1828199    継承がコンパイルされない

OTTにより生成された.cppファイルは、拡張継承クラスが宣言されないためコンパイルされません。

Bug#1821665    OTTではNTの不具合に対処するためにGET/SETVECTOROFREFSを生成する必要がある

OTTでは、REFのコレクションに対してgetVectorのかわりにgetVectorOfRefsを生成する必要があります。

Bug#1774430    JavaバージョンのOTTではWE8EBCDIC1047がサポートされない

WE8EBCDIC1047キャラクタ・セットはサポートされません。

Bug#1765059    OTTはPL/SQLパッケージ用の.hファイル構造を生成しようとする

OTTは、スキーマ内のすべてのオブジェクト型について.hファイルを生成するときに、PL/SQLパッケージ用のエントリを生成しようとします。

Bug#1764833    OTTではサブタイプ化と継承を伴うヘッダー・ファイルが正常に生成されない

データベース内の型が型の継承により編成されている場合、OTTにより生成されるヘッダーには複数の問題がありました。

Bug#1693635    OTTは生成された型を拡張して適切なインクルードを生成する必要がある

型に拡張型の属性または親がある場合、OTTは適切なインクルードを生成する必要があります。