原典情報: $ORACLE_HOME/precomp/doc/ott/readme.doc
目次
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を指定できます。このパラメータの書式は次のとおりです。
デフォルト値は、jdbc:oracle:oci8:@です。Thinドライバを指定するには、URL=jdbc:oracle:thin:@host:port:sidと入力します。hostはデータベースが実行中のホストの名前、portはポート番号、sidはOracle SIDです。
----------------------------リリース9.0.1以上のOTTでは、オブジェクトの型の継承がサポートされます。Pro*C/C++ユーザーとOCIユーザー向けに、このリリースのOTTでは、継承される属性の宣言前に、その属性をカプセル化された構造体内で特殊な名前_superを使用して宣言することで、オブジェクト・サブタイプを表すC構造体が生成されるようになりました。また、オブジェクトの置換可能な属性は、インライン化されるのではなくポインタに変換されます。OCCIユーザー向けに、継承型は親の型から導出され、生成されたファイルでは親のreadSQLメソッドおよびwriteSQLメソッドがコールされます。継承のサポートの詳細は、Pro*C/C++、OCIおよびOCCIのマニュアルの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ファイル内の値がオーバーライドされます。
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エンティティ名について、追加の変換が実行されます。
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は適切なインクルードを生成する必要があります。