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にコンテンツ文字列を設定します