9.6 LOB用のOCCI API
OCCIには、ユーザー定義型のオブジェクトをC++クラス・インスタンスとして操作するためのシームレスなインタフェースも用意されています。
Oracle C++ Call Interface (OCCI)は、Oracle Databaseでデータを操作するためのC++ APIです。OCCIは、使いやすいC++クラス・セットとして構成されています。これにより、C++プログラムでは、データベースへの接続、SQL文の実行、データベース表への値の挿入とデータベース表の値の更新、問合せ結果の取得、データベースでのストアド・プロシージャの実行、データベース・スキーマ・オブジェクトのメタデータへのアクセスが可能になります。
Oracle C++ Call Interface (OCCI)は、OCIとともに使用することによって、アプリケーションを構築できます。
OCCI APIには、JDBCおよびODBCと比べて次のメリットがあります。
-
OCCIにはJDBCより多くのOracle機能があります。OCCIは、JDBCにないすべてのOCI機能を提供します。
-
OCCIは、コンパイル型のパフォーマンスを実現します。コンパイル型のプログラムでは、ソース・コードは、可能なかぎり初めからコンピュータ言語に近いコードで記述されています。JDBCはインタプリタ型APIであるため、コンパイル型APIほどのパフォーマンスは実現できません。インタプリタ型のプログラムでは、コードの各行を1行ずつコンピュータ言語に近いコードに解析する必要があるため、パフォーマンスが低下します。
-
OCCIでは、スマート・ポインタを使用してメモリーを管理できます。OCCIオブジェクトのメモリー管理に注意する必要がありません。そのため、アプリケーション・コードのパフォーマンスが大幅に向上します。
-
OCCIのナビゲーショナル・アクセスによって、直観的にオブジェクトにアクセスし、メソッドをコールできます。オブジェクトへの変更を持続するために、対応するSQL文を記述する必要はありません。クライアント側のキャッシュを使用する場合、オブジェクト・インタフェースよりナビゲーショナル・アクセス用インタフェースの方がパフォーマンスが高くなります。
-
ODBCに関しては、OCCI APIの方が簡単に使用できます。ODBCはC言語で構築されていますが、OCCIには、CにはないC++のすべてのメリットがあります。さらに、ODBCは学習が難しいという評判があります。それに対してOCCIは、使いやすさを基に設計されています。
OCCIを使用すると、LOBに対してランダムおよびピース単位の操作を実行できます。つまり、LOB値の一部を読取りまたは書込みする操作のオフセットまたは量を指定できます。
OCCIには、C++アプリケーションで各種のLOBインスタンスをオブジェクトとして使用できるように、次のクラスが用意されています。
-
Clobクラス 永続CLOBおよび永続NCLOBに格納されているデータにアクセスし、データを変更します -
Blobクラス 永続BLOBに格納されているデータにアクセスし、データを変更します
関連項目:
各クラスの構文情報とOCCIの一般的な詳細は、『Oracle C++ Call Interface開発者ガイド』を参照してください。
Clobクラス
Clobドライバは、SQL LOBロケータを使用してCLOBオブジェクトを実装します。これは、CLOBオブジェクトに、データ自体ではなくSQL CLOBデータへの論理ポインタが含まれていることを意味します。
CLOBインタフェースでは、SQL CLOB値の長さの取得、クライアント上のCLOB値のマテリアライズ化、および部分文字列の取得を実行するためのメソッドが提供されます。ResultSetインタフェースおよびStatementインタフェースのgetClob()やsetClob()などのメソッドを使用すると、SQL CLOB値にアクセスできます。
Blobクラス
ResultSetインタフェースおよびStatementインタフェースのgetBlob()やsetBlob()などのメソッドを使用すると、SQL BLOB値にアクセスできます。Blobインタフェースでは、SQL BLOB値の長さの取得、クライアント上のBLOB値のマテリアライズ化、およびBLOBの一部の抽出を実行するためのメソッドが提供されます。
固定幅文字セットの規則
OCCIの場合、固定幅のクライアント側文字セットには、次の規則が適用されます。
-
Clob: オフセット・パラメータおよび量パラメータは、常に文字で表されます。 -
Blob: オフセット・パラメータおよび量パラメータは、常にバイトで表されます。
次の規則は、可変幅のクライアント側文字セットに対してのみ適用されます。
-
オフセット・パラメータ: クライアント側文字セットが可変幅かどうかにかかわらず、オフセット・パラメータは常に次のように表されます。
-
Clob(): 文字で表されます -
Blob(): バイトで表されます
-
-
量パラメータ: 量パラメータは、常に次のように表されます。
-
Clob: サーバー側LOBを参照する場合は文字で表されます。 -
Blob: クライアント側バッファを参照する場合はバイトで表されます。
-
-
length(): クライアント側文字セットが可変幅かどうかにかかわらず、出力の長さは次のように表されます。
-
Clob.length(): 文字で表されます -
Blob.length(): バイトで表されます
-
-
Clob.read()およびBlob.read(): 可変幅のクライアント側文字セット、
CLOBおよびNCLOBでは次のようになります。-
入力量は、文字で表されます。入力量は、サーバー側の
CLOBまたはNCLOBから読み取られる文字数を表します。 -
出力量は、バイトで表されます。出力量は、OCCIバッファ・パラメータ
bufferに読み取られたバイト数を表します。
-
-
Clob.write()およびBlob.write(): 可変幅のクライアント側文字セット、
CLOBおよびNCLOBでは次のようになります。-
入力量は、バイトで表されます。入力量は、OCCI入力バッファ
bufferにあるデータのバイト数を表します。 -
出力量は、文字で表されます。出力量は、サーバー側の
CLOBまたはNCLOBに書き込まれた文字数を表します。
-
-
その他のOCCI操作の量パラメータ: OCCI LOB操作
Clob.copy()、Clob.erase()、Clob.trim()については、クライアント側の文字セットにかかわらず、amountパラメータはCLOBおよびNCLOBの文字数です。これらのすべての操作では、サーバー上のLOBデータの量を参照します。
表9-8 LOB用のOCCIメソッド
| 分類 | 関数およびプロシージャ | 説明 |
|---|---|---|
| 健全性チェック | Clob/Blob.isInitialized |
LOBロケータが初期化されているかどうかを確認します。 |
| オープンとクローズ | Clob/Blob.Open() |
LOBをオープン |
Clob/Blob.isOpen() |
LOBがオープンしているかどうかの確認 | |
Clob/Blob.Close() |
LOBのクローズ | |
| 読取り操作 | Blob/Clob.length() |
LOB長の取得 |
Blob/Clob.getChunkSize() |
最適な読取りまたは書込みサイズを取得します | |
Blob/Clob.read() |
指定されたオフセットからLOBのデータを読み取ります | |
Clob.getCharSetId() |
LOBの文字セットIDを戻します | |
Clob.getCharSetForm() |
LOBの文字セット・フォームを返します。 | |
| 変更操作 | Blob/Clob.write() |
指定されたオフセットからLOBにデータを書き込みます |
Blob/Clob.trim() |
LOB値の指定された長さまでの切捨て | |
| 複数のロケータを含む操作 | Clob/Blob.operator == and != |
2つのLOBロケータが同じLOBを参照しているかどうかを確認します。 |
Blob/Clob.append() |
LOB値を別のLOBに追加します | |
Blob/Clob.copy() |
LOBの全体または一部を他のLOBにコピーするか、BFILEからLOBにロードします | |
Clob/Blob.operator = |
LOBを別のLOBに割り当てます | |
| SecureFilesに固有の操作 | Blob/Clob.getOptions() |
SecureFilesのオプション(重複除外、圧縮、暗号化)を戻します。 |
Blob/Clob.setOptions() |
SecureFilesのLOB機能(重複除外および圧縮)を設定します | |
Blob/Clob.getContentType() |
SecureFilesのコンテンツ文字列を取得します | |
Blob/Clob.setContentType() |
SecureFilesにコンテンツ文字列を設定します |
親トピック: LOB用のロケータ・インタフェース