LOBをサポートするために複数のAPIが用意されています。
ここでは、次の項目について説明します。
表13-1に、LOB機能をサポートするプログラム環境を示します。
表13-1 LOBをサポートするプログラム環境
| 言語 | プリコンパイラまたはインタフェース・プログラム | 構文についての参照先 | この章での参照先 |
|---|---|---|---|
DBMS_LOBパッケージ |
『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』 |
||
Oracle Call Interface for C (OCI) |
『Oracle Call Interfaceプログラマーズ・ガイド』 |
||
C++ |
Oracle Call Interface for C++ (OCCI) |
『Oracle C++ Call Interfaceプログラマーズ・ガイド』 |
|
Pro*C/C++プリコンパイラ |
『Pro*C/C++プログラマーズ・ガイド』 |
||
Pro*COBOLプリコンパイラ |
『Pro*COBOLプログラマーズ・ガイド』 |
||
JDBC API |
『Oracle Database JDBC開発者ガイド』 |
||
ADO/OLE DB |
Oracle Provider for OLE DB(OraOLEDB) |
『Oracle Provider for OLE DB開発者ガイド for Microsoft Windows』 |
|
.NET |
Oracle Data Provider for .NET(ODP.NET) |
Oracle Data Provider for .NETの開発者ガイド |
表13-2および表13-3では、8つのプログラム用LOBインタフェースについて、LOB操作に使用するそれぞれのファンクションおよびメソッドをリストし、比較しています。表が2つに分かれているのは、単に8つのインタフェースすべてを記載するためです。これらのインタフェースのLOBに関する機能については、この後の項で説明します。
表13-2 LOBインタフェースの比較(1/2)
| PL/SQL: DBMS_LOB(dbmslob.sql) | C (OCI)(ociap.h) | C++ (OCCI) (occiData.h)。およびCLOBおよびBFILEクラス用。 | Pro*C/C++およびPro*COBOL |
|---|---|---|---|
|
利用不可 |
利用不可 |
利用不可 |
|
利用不可 |
利用不可 |
利用不可 |
|
利用不可 |
利用不可 |
利用不可 |
|
|
|
|
利用不可(PL/SQL割当て演算子を使用) |
|
|
|
利用不可 |
|
|
利用不可 |
利用不可 |
|
( |
利用不可 |
|
|
|
|
利用不可 |
利用不可 |
|
利用不可 |
|
|
|
|
利用不可 |
|
利用不可 |
|
利用不可 |
|
利用不可 |
|
|
|
利用不可 |
|
|
|
|
|
|
|
利用不可 |
|
|
|
|
|
DBMS_LOB.GETCHUNKSIZE |
OCILobGetChunkSize() |
Blob.getChunkSize() |
DESCRIBE [CHUNKSIZE ] |
|
|
利用不可 |
利用不可 |
|
|
|
利用不可 |
|
|
|
|
|
|
|
|
|
|
|
|
該当なし(BFILENAME演算子を使用) |
|
|
|
利用不可 |
|
利用不可 |
|
|
|
|
|
利用不可 |
|
演算子= ( )=/!= |
利用不可 |
|
|
|
|
|
|
|
LOAD FROM FILE |
利用不可 |
|
|
利用不可 |
|
|
|
|
|
|
|
|
|
|
|
利用不可 |
|
|
|
|
|
|
|
|
|
|
利用不可 |
|
|
|
利用不可 |
利用不可 |
|
|
利用不可 |
利用不可 |
|
|
利用不可 |
利用不可 |
利用不可 |
|
演算子= ( )を使用、またはコンストラクタをコピー |
利用不可 |
表13-3 LOBインタフェースの比較(2/2)
| PL/SQL: DBMS_LOB(dbmslob.sql) | Java(JDBC) | ODP.NET |
|---|---|---|
|
|
|
|
position |
|
|
|
利用不可 |
|
|
|
|
利用不可(等号を使用) |
|
|
利用不可 |
利用不可 |
|
利用不可 |
利用不可 |
|
|
|
|
readおよびwriteを使用 |
|
|
利用不可 |
利用不可 |
|
利用不可 |
利用不可 |
|
|
|
|
|
|
|
|
利用不可 |
|
|
|
|
|
|
|
|
|
|
Use |
|
|
|
|
|
|
|
|
利用不可 |
利用不可 |
|
|
|
利用不可 |
|
利用不可 |
|
|
|
|
|
利用不可 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
利用不可 |
|
|
利用不可 |
|
|
利用不可 |
|
PL/SQL DBMS_LOBパッケージは、次の操作のために使用できます。
内部永続LOBおよび一時LOB: 全体またはピース単位の読取りおよび変更操作
BFILE: 読取り操作
関連項目:
パラメータ、パラメータ・タイプ、戻り値およびサンプル・コードの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
DBMS_LOBルーチンは、LOBロケータに基づいて動作します。DBMS_LOBルーチンを正常に実行するには、ルーチンをコールする前に、データベース表領域または外部ファイルシステムに存在しているLOBを示す入力ロケータを用意する必要があります。
永続LOB: SQLを使用してLOB列を含む表を定義します。その後、SQLを使用してこれらのLOB列のロケータを初期化または移入できます。
外部LOB: アクセス対象の外部LOBを含む有効物理ディレクトリにマップする、ディレクトリ・オブジェクトを定義します。これらのファイルは存在し、Oracleサーバーで処理を行うための読取り権限を所有している必要があります。オペレーティング・システムがパス名の大/小文字を区別する場合には、正しい大/小文字でディレクトリを指定してください。詳細は、「ディレクトリ・オブジェクト」を参照してください。
一度LOBを定義して作成すると、SELECTを実行してLOBロケータをローカルのPL/SQL LOB変数に割り当てることができます。また、この変数を、LOB値にアクセスするためのDBMS_LOBへの入力パラメータとして使用できます。
次の項では、各DBMS_LOBルーチンで提供されている例を使用して、前述の操作について説明します。
DBMS_LOB PL/SQLパッケージのプロシージャで使用されるオフセット・パラメータと量パラメータには、次のガイドラインが適用されます。
文字データ(すべての形式、固定幅および可変幅)の場合、amountパラメータとoffsetパラメータは文字単位です。これは、CLOBデータ型とNCLOBデータ型に対する操作に適用されます。
バイナリ・データの場合、offsetパラメータとamountパラメータはバイト単位です。このガイドラインはBLOBデータ型に対する操作に適用されます。
次のプロシージャを使用する場合のガイドライン
量パラメータには、ロード元のBFILEのサイズを超える値を指定できません。これらのプロシージャを使用してBFILE全体をロードするには、BFILEの正確なサイズまたは最大許容記憶域の上限を指定する必要があります。
DBMS_LOB.READを使用する場合、amountパラメータはデータより大きいサイズに指定できます。バッファ・サイズ以下の値を指定する必要があります。バッファ・サイズの上限は32KBです。
関連項目:
キャラクタ・セットIDを確認するには、キャラクタ・セット名を知っている必要があります。
データベース・キャラクタ・セットおよび各国語キャラクタ・セットとして有効なキャラクタ・セット名がリストされているV$NLS_VALID_VALUESビューから選択できます。次に、目的のキャラクタ・セット名を1つの文字列引数に指定したNLS_CHARSET_IDファンクションをコールします。キャラクタ・セットIDが整数で戻されます。UTF16には、キャラクタ・セット名がないので、正しく動作しません。UTF16には、キャラクタ・セットIDとして1000を使用します。UTF16は、データベース・キャラクタ・セットまたは各国語キャラクタ・セットとしては許可されていませんが、DBMS_LOBのAPIではデータベース変換用にサポートされています。DBMS_LOB.LOADCLOBFROMFILEおよびDBMS_LOBの他のプロシージャは、キャラクタ・セット名ではなくキャラクタ・セットIDを入力として受け取ります。
関連項目:
詳細およびサポートされているUnicodeエンコーディングは、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_LOB.LOADCLOBFROMFILEに関する項を参照してください
サポートされている言語は、『Oracle Databaseグローバリゼーション・サポート・ガイド』の付録Aを参照してください
次の表に、DBMS_LOBプロシージャを示します。
表13-4 PL/SQL: LOB値を変更するDBMS_LOBプロシージャ
| 関数/プロシージャ | 説明 |
|---|---|
|
LOB値を別のLOBに追加します。 |
|
|
|
|
|
LOBの全体または一部を他のLOBにコピーします。 |
|
指定のオフセットから開始して、LOBの一部を消去します。 |
|
LOBの指定されたオフセットから指定された長さのデータを削除します。 |
|
LOBの指定されたオフセットに、指定されたデータ(32KB未満)を挿入します。 |
|
指定されたオフセットから他の指定されたオフセットに、指定されたバイト数を移動します。 |
|
指定されたオフセットのデータを、指定されたデータ(32KB未満)と置換します。 |
|
|
|
キャラクタ・セットをファイルからLOBにロードします。 |
|
バイナリ・データをファイルからLOBにロードします。 |
|
LOB機能(重複除外および圧縮)を設定します。 |
|
指定された長さまでLOB値を切り捨てます。 |
|
指定されたオフセットからLOBにデータを書き込みます。 |
|
データをLOBの終わりに書き込みます。 |
表13-5 PL/SQL: 内部LOBおよび外部LOBの値の読取りまたはテストを行うDBMS_LOBプロシージャ
| 関数/プロシージャ | 説明 |
|---|---|
|
2つのLOBの値を比較します。 |
|
読取りおよび書込み用にチャンク・サイズを取得します。これは永続LOBにのみ適用され、外部LOB( |
|
LOB値の長さを取得します。 |
|
SecureFilesのオプション(重複除外、圧縮、暗号化)を戻します。 |
|
データベース構成のLOB記憶域制限を取得します。 |
|
LOBにおけるパターンのn番目の出現位置を戻します。 |
|
このファンクションは、渡される |
|
指定されたオフセットからLOBのデータを読み取ります。 |
|
デフォルトのLOB列の設定を上書きする、SecureFilesのオプション(重複除外および圧縮)を設定します。サーバーへのラウンドトリップが発生します。 |
|
指定されたオフセットからLOB値の一部を戻します。 |
表13-6 PL/SQL: 一時LOBを操作するDBMS_LOBプロシージャ
| 関数/プロシージャ | 説明 |
|---|---|
CREATETEMPORARY |
一時LOBを作成します。 |
ISTEMPORARY |
LOBロケータが一時LOBを参照するかどうかを確認します。 |
FREETEMPORARY |
一時LOBを解放します。 |
表13-7 PL/SQL: BFILE固有のDBMS_LOB読取り専用プロシージャ
| 関数/プロシージャ | 説明 |
|---|---|
|
ファイルをクローズします。 |
|
オープンしていたすべてのファイルをクローズします。 |
|
ファイルがサーバー上に存在するかどうかを確認します。 |
|
ディレクトリ・オブジェクト名とファイル名を取得します。 |
|
入力 |
|
ファイルをオープンします。 |
表13-8 PL/SQL: 内部LOBおよび外部LOBをオープンおよびクローズするDBMS_LOBプロシージャ
| 関数/プロシージャ | 説明 |
|---|---|
|
LOBをオープンします。 |
|
LOBがオープンしているかどうかを確認します。 |
|
LOBをクローズします。 |
「OPENおよびCLOSEインタフェースを使用した永続LOBのオープン」では、特定のLOB操作(LOBを含む行のINSERTなど)について、これらのプロシージャをさらに詳しく説明します。
Oracle Call Interface(OCI)のLOB関数を使用すると、CでLOBにアクセスして変更し、BFILEからデータを読み取ることができます。
関連項目:
この項で説明するすべての内容の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』の「LOBおよびBFILEの操作」の章を参照してください。
小さいLOBのOCIアクセスを向上するため、ロケータもフェッチしながら、LOBデータをプリフェッチおよびキャッシュできます。これは、内部LOB、一時LOBおよびBFILEに適用されます。
データを2バイトのUnicodeフォーマットで読取りまたは書込みする場合は、OCILobRead2()およびOCILobWrite2()のcsid(キャラクタ・セットID)パラメータをOCI_UTF16IDに設定します。
CSIDパラメータは、バッファ・パラメータ用のCSIDを示します。csidパラメータは、すべてのCSIDに設定できます。csidパラメータが設定されていると、環境変数NLS_LANGより優先されます。
関連項目:
OCIUnicodeToCharSet()関数の説明およびOCI構文全般の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。
異なる言語におけるアプリケーションの実装の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
OCIの場合、固定幅のクライアント側キャラクタ・セットには、次の規則が適用されます。
CLOBおよびNCLOB: オフセット・パラメータおよび量パラメータは、常に文字で表されます。
BLOBおよびBFILE: オフセット・パラメータおよび量パラメータは、常にバイトで表されます。
次の規則は、可変幅のクライアント側キャラクタ・セットに対してのみ適用されます。
オフセット・パラメータ:
クライアント側キャラクタ・セットが可変幅かどうかにかかわらず、オフセット・パラメータは常に次のように表されます。
CLOBおよびNCLOB: 文字で表されます。
BLOBおよびBFILE: バイトで表されます。
量パラメータ:
量パラメータは、常に次のように表されます。
サーバー側LOBを参照する場合: 文字で表されます。
クライアント側バッファを参照する場合: バイトで表されます。
OCILobFileGetLength():
クライアント側キャラクタ・セットが可変幅かどうかにかかわらず、出力の長さは次のように表されます。
CLOBおよびNCLOB: 文字で表されます。
BLOBおよびBFILE: バイトで表されます。
OCILobRead2():
可変幅のクライアント側キャラクタ・セット、CLOBおよびNCLOBでは次のようになります。
入力量は、文字で表されます。入力量は、サーバー側のCLOBまたはNCLOBから読み取られる文字数を表します。
出力量は、バイトで表されます。出力量は、バッファbufpに読み取られたバイト数を表します。
OCILobWrite2(): 可変幅のクライアント側キャラクタ・セット、CLOBおよびNCLOBでは次のようになります。
入力量は、バイトで表されます。入力量は、入力バッファbufpにあるデータのバイト数を表します。
出力量は、文字で表されます。出力量は、サーバー側のCLOBまたはNCLOBに書き込まれた文字数を表します。
その他すべてのLOB操作については、クライアント側キャラクタ・セットかどうかにかかわらず、量パラメータはCLOBおよびNCLOBについては文字で表されます。これには、OCILobCopy2()、OCILobErase2()、OCILobLoadFromFile2()およびOCILobTrim2()が含まれます。これらの操作はすべて、サーバー上のLOBデータの量に関する操作です。
関連項目:
『Oracle Databaseグローバリゼーション・サポート・ガイド』
OCILobLoadFromFile2()を使用する場合、量パラメータに、BFILEの長さより長い値を指定することはできません。BFILE全体をロードするには、OCILobGetStorageLimit()の戻り値を渡します。
OCILobRead2()を使用してLOBの終わりまで読み取るには、OCILobGetStorageLimit()の戻り値と等しい量を指定します。詳細は、「LOBからのデータの読取りについて」を参照してください。
OCIプログラムでOCILobLocatorポインタを割り当てる場合は、特殊事例として=代入演算子を使用する必要があります。ポインタの割当てによりLOBのシャロー・コピーが作成されます。ポインタの割当て後は、ソースLOBとターゲットLOBが同じデータ・コピーを指します。
これらのセマンティクスは、割当ての実行にOCILobAssign()やOCILobLocatorAssign()などのLOB APIを使用する場合とは異なります。これらのAPIを使用すると、割当て後のロケータは独立したデータ・コピーを論理的に指します。
一時LOBの場合は、ポインタ割当てを実行する前にOCIFreeTemporary()をコールして、ターゲットLOBロケータ内の一時LOBが解放されていることを確認する必要があります。これに対して、OCILobLocatorAssign()を使用すると、割当てが発生する前に、ターゲットLOBロケータ変数内の元の一時LOB(存在する場合)が自動的に解放されます。
表13-9 OCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更する関数
| 関数/プロシージャ | 説明 |
|---|---|
|
LOB値を別のLOBに追加します。 |
|
1回のラウンドトリップで複数のロケータを使用してデータを書き込みます。 |
|
LOBの全体または一部を他のLOBにコピーします。 |
|
指定のオフセットから開始して、LOBの一部を消去します。 |
|
|
|
SecureFilesにコンテンツ文字列を設定します。 |
|
SecureFilesのオプション設定(重複除外および圧縮)を使用可能にします。 |
|
LOBを切り捨てます。 |
|
バッファのデータをLOBに書き込み、既存データを上書きします。 |
|
バッファのデータをLOBの終わりに書き込みます。 |
表13-10 OCI: 永続LOBおよび外部LOB(BFILE)の値の読取りまたはテストを行う関数
| 関数/プロシージャ | 説明 |
|---|---|
|
1回のラウンドトリップで複数のロケータを使用してデータを読み取ります。 |
|
読取りおよび書込み用にチャンク・サイズを取得します。これは永続LOBに適用され、外部LOB( |
|
SecureFilesのコンテンツ文字列を取得します。 |
|
LOBまたは |
|
指定されたSecureFilesの使用可能な設定(重複除外、圧縮および暗号化)を取得します。 |
|
内部LOBの最大長を取得します。 |
|
|
表13-11 OCI: 一時LOBを操作する関数
| 関数/プロシージャ | 説明 |
|---|---|
|
一時LOBを作成します。 |
|
一時LOBが存在するかどうかを確認します。 |
|
一時LOBを解放します。 |
表13-12 OCI: BFILE固有の読取り専用関数
| 関数/プロシージャ | 説明 |
|---|---|
|
オープンしている |
|
オープンしているすべての |
|
|
|
|
|
|
|
|
表13-13 OCI: LOBロケータ関数
| 関数/プロシージャ | 説明 |
|---|---|
|
LOBロケータを別のLOBロケータに割り当てます。 |
|
LOBのキャラクタ・セット・フォームを戻します。 |
|
LOBのキャラクタ・セットIDを戻します。 |
|
|
|
2つのLOBロケータが同じLOBを参照しているかどうかを確認します。 |
|
LOBロケータが初期化されているかどうかを確認します。 |
表13-14 OCI: LOBバッファリング関数
| 関数/プロシージャ | 説明 |
|---|---|
|
バッファリング・サブシステムを使用禁止にします。 |
|
後続のLOBデータの読取り/書込みに、LOBバッファリング・サブシステムを使用します。 |
|
LOBバッファリング・サブシステムへの変更を、データベース(サーバー)へフラッシュします。 |
表13-15 OCI: 内部LOBおよび外部LOBをオープンおよびクローズする関数
| 関数/プロシージャ | 説明 |
|---|---|
|
LOBをオープンします。 |
|
LOBがオープンしているかどうかを確認します。 |
|
LOBをクローズします。 |
OCIの例は、次の章にも記載されています。
これ以外のOCIのデモ・スクリプトについては、『Oracle Call Interfaceプログラマーズ・ガイド』の付録B「OCIデモ・プログラム」を参照してください。
Oracle C++ Call Interface (OCCI)は、Oracle Databaseでデータを操作するためのC++ APIです。OCCIは、使いやすいC++クラス・セットとして構成されています。これにより、C++プログラムでは、データベースへの接続、SQL文の実行、データベース表への値の挿入とデータベース表の値の更新、問合せ結果の取得、データベースでのストアド・プロシージャの実行、データベース・スキーマ・オブジェクトのメタデータへのアクセスが可能になります。また、OCCIには、ユーザー定義型のオブジェクトをC++クラス・インスタンスとして操作するためのシームレスなインタフェースも用意されています。
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および外部LOB(BFILE)からの読取り
永続LOBへの書込み
OCCIには、C++アプリケーションで各種のLOBインスタンスをオブジェクトとして使用できるように、次のクラスが用意されています。
Clobクラス: 内部CLOBおよび内部NCLOBに格納されているデータにアクセスし、データを変更します。
Blobクラス: 内部BLOBに格納されているデータにアクセスし、データを変更します。
Bfileクラス: 外部LOB(BFILE)に格納されているデータにアクセスし、データを読み取ります。
関連項目:
各クラスの構文情報とOCCIの一般的な詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』を参照してください。
Clobドライバは、SQL LOBロケータを使用してCLOBオブジェクトを実装します。これは、CLOBオブジェクトに、データ自体ではなくSQL CLOBデータへの論理ポインタが含まれていることを意味します。
CLOBインタフェースでは、SQL CLOB値の長さの取得、クライアント上のCLOB値のマテリアライズ化、および部分文字列の取得を実行するためのメソッドが提供されます。ResultSetインタフェースおよびStatementインタフェースのgetClob()やsetClob()などのメソッドを使用すると、SQL CLOB値にアクセスできます。
関連項目:
Clobクラスの詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』を参照してください。
ResultSetインタフェースおよびStatementインタフェースのgetBlob()やsetBlob()などのメソッドを使用すると、SQL BLOB値にアクセスできます。Blobインタフェースでは、SQL BLOB値の長さの取得、クライアント上のBLOB値のマテリアライズ化、およびBLOBの一部の抽出を実行するためのメソッドが提供されます。
関連項目:
Blobクラスのメソッドの詳細およびC++アプリケーションでのBlobオブジェクトのインスタンス化および初期化の詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』を参照してください。
異なる言語におけるアプリケーションの実装の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
OCCIの場合、固定幅のクライアント側キャラクタ・セットには、次の規則が適用されます。
Clob: オフセット・パラメータおよび量パラメータは、常に文字で表されます。
Blob: オフセット・パラメータおよび量パラメータは、常にバイトで表されます。
Bfile: オフセット・パラメータおよび量パラメータは、常にバイトで表されます。
次の規則は、可変幅のクライアント側キャラクタ・セットに対してのみ適用されます。
オフセット・パラメータ: クライアント側キャラクタ・セットが可変幅かどうかにかかわらず、オフセット・パラメータは常に次のように表されます。
Clob(): 文字で表されます
Blob(): バイトで表されます
Bfile(): バイトで表されます
量パラメータ: 量パラメータは、常に次のように表されます。
Clob: サーバー側LOBを参照する場合は文字で表されます。
Blob: クライアント側バッファを参照する場合はバイトで表されます。
Bfile: クライアント側バッファを参照する場合はバイトで表されます。
length(): クライアント側キャラクタ・セットが可変幅かどうかにかかわらず、出力の長さは次のように表されます。
Clob.length(): 文字で表されます
Blob.length(): バイトで表されます
Bfile.length(): バイトで表されます
Clob.read()およびBlob.read(): 可変幅のクライアント側キャラクタ・セット、CLOBおよびNCLOBでは次のようになります。
入力量は、文字で表されます。入力量は、サーバー側のCLOBまたはNCLOBから読み取られる文字数を表します。
出力量は、バイトで表されます。出力量は、OCCIバッファ・パラメータbufferに読み取られたバイト数を表します。
Clob.write()およびBlob.write(): 可変幅のクライアント側キャラクタ・セット、CLOBおよびNCLOBでは次のようになります。
入力量は、バイトで表されます。入力量は、OCCI入力バッファbufferにあるデータのバイト数を表します。
出力量は、文字で表されます。出力量は、サーバー側のCLOBまたはNCLOBに書き込まれた文字数を表します。
その他すべてのOCCI LOB操作については、クライアント側キャラクタ・セットかどうかにかかわらず、量パラメータはCLOBおよびNCLOBについては文字で表されます。内容は次のとおりです。
Clob.copy()
Clob.erase()
Clob.trim()
LoadFromFile機能用にオーバーロードされたClob.copy()
これらの操作はすべて、サーバー上のLOBデータの量に関する操作です。
関連項目:
『Oracle Databaseグローバリゼーション・サポート・ガイド』
ClobおよびBlobにcopy()メソッドを使用すると、BFILEからデータをロードできます。このメソッドの量パラメータには、次のいずれかの値を渡すことができます。
データの一部をロードする場合は、BFILEのサイズよりも小さい量。
データ全体をロードする場合は、BFILEのサイズと等しい量。
BFILEデータをすべてロードする場合は、UB8MAXVAL定数
BFILEのサイズより大きいサイズは指定できません。
Clob、BlobまたはBfileオブジェクトに対するread()メソッドは、BFILEからデータを読み取ります。量パラメータの次のいずれかの値を渡して、読み取るデータ量を指定できます。
データの一部をロードする場合は、BFILEのサイズよりも小さい量。
データ全体をロードする場合は、BFILEのサイズと等しい量。
BFILEの終わりまでストリーム・モードで読み取る場合は、0 (ゼロ)。
BFILEのサイズより大きいサイズは指定できません。
関連項目:
『Oracle C++ Call Interfaceプログラマーズ・ガイド』
http://www.oracle.com/productsにアクセスして、OCCIについての項目および製品情報を検索してください。
表13-16 OCCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更するClobメソッドおよびBlobメソッド
| 関数/プロシージャ | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
バッファのデータをLOBに書き込み、既存データを上書きします。 |
表13-17 OCCI: 永続LOBおよびBFILEの値の読取りまたはテストを行うBlob、ClobおよびBfileのメソッド
| 関数/プロシージャ | 説明 |
|---|---|
|
読取りおよび書込み用にチャンク・サイズを取得します。これは永続LOBに適用され、外部LOB( |
|
既存および新規に作成されたLOBの設定を取得します。 |
|
LOBまたは |
|
|
|
既存および新規に作成されたLOB設定を使用可能にします。 |
表13-18 OCCI: BFILE固有の読取り専用メソッド
| 関数/プロシージャ | 説明 |
|---|---|
|
オープンしている |
|
|
|
|
|
ディレクトリ・オブジェクト名を取得します。 |
|
|
|
|
表13-19 他のOCCI LOBメソッド
| メソッド | 説明 |
|---|---|
|
LOBロケータを別のLOBロケータに割り当てます。= |
|
LOBのキャラクタ・セット・フォームを戻します。 |
|
LOBのキャラクタ・セットIDを戻します。 |
|
|
|
2つのLOBが同じLOBを参照しているかどうかを確認します。 |
|
LOBが初期化されているかどうかを確認します。 |
埋込みSQLを使用すると、永続LOBの全体、またはLOBの初め、中、終わりの部分を変更できます。読取りを目的として内部LOBと外部LOBの両方にアクセスしたり、永続LOBに対して書込みを行うことができます。
埋込みSQL文によって、BLOB、CLOB、NCLOBおよびBFILEに格納されたデータにアクセスできます。この種の文の詳細は後述します。
関連項目:
構文、ホスト変数、ホスト変数型およびサンプル・コードの詳細は、『Pro*C/C++プログラマーズ・ガイド』を参照してください。
PL/SQLのロケータとは異なり、Pro*C/C++のロケータはロケータ・ポインタにマップされ、LOBまたはBFILE値を参照するために使用できます。
埋込みSQL LOB文を正常に実行するには、次の処理が必要です。
表13-21 Pro*C/C++: 永続LOBの値を変更する埋込みSQL文
| 文 | 説明 |
|---|---|
|
LOB |
|
LOBの全体または一部を別のLOBにコピーします。 |
|
指定のオフセットから開始して、LOBの一部を消去します。 |
|
永続LOBの指定されたオフセットに |
|
LOBを切り捨てます。 |
|
LOBの指定されたオフセットにバッファのデータを書き込みます。 |
|
バッファのデータをLOBの終わりに書き込みます。 |
表13-22 Pro*C/C++: LOBのイントロスペクションに使用する埋込みSQL文
| 文 | 説明 |
|---|---|
|
書込み用のチャンク・サイズを取得します。これは、永続LOBに対してのみ機能します。外部LOB ( |
|
LOBまたは |
|
|
表13-23 Pro*C/C++: 一時LOBを操作する埋込みSQL文
| 文 | 説明 |
|---|---|
|
一時LOBを作成します。 |
|
LOBロケータが一時LOBを参照しているかどうかをチェックします。 |
|
一時LOBを解放します。 |
表13-24 Pro*C/C++: BFILE固有の埋込みSQL文
| 文 | 説明 |
|---|---|
|
オープンしているすべての |
|
|
|
|
表13-25 Pro*C/C++: LOBロケータ埋込みSQL文
| 文 | 説明 |
|---|---|
|
LOBロケータを別のLOBロケータに割り当てます。 |
|
|
表13-26 Pro*C/C++: LOBバッファリングのための埋込みSQL文
| 文 | 説明 |
|---|---|
|
バッファリング・サブシステムを使用禁止にします。 |
|
後続のLOBデータの読取り/書込みに、LOBバッファリング・サブシステムを使用します。 |
|
LOBバッファリング・サブシステムへの変更を、データベース(サーバー)へフラッシュします。 |
埋込みSQLを使用すると、永続LOBの全体、または永続LOBの初め、中、終わりの部分を変更できます。読取りを目的として内部LOBと外部LOBの両方にアクセスしたり、永続LOBに対して書込みを行うこともできます。
埋込みSQL文によって、BLOB、CLOB、NCLOBおよびBFILEに格納されたデータにアクセスできます。この種の文の詳細は後述します。
PL/SQLのロケータとは異なり、Pro*COBOLのロケータはロケータ・ポインタにマップされ、LOBまたはBFILE値を参照するために使用されます。埋込みSQL LOB文を正常に実行するには、次の処理が必要です。
Pro*COBOLインタフェースが必要な機能を提供していない場合は、Cを使用してOCIをコールできます。このようなプログラムはオペレーティング・システムによって異なるため、ここでは例を示しません。
関連項目:
構文、ホスト変数、ホスト変数型およびサンプル・コードの詳細は、『Pro*COBOLプログラマーズ・ガイド』を参照してください。
表13-28 Pro*COBOL: LOBの値を変更する埋込みSQL文
| 文 | 説明 |
|---|---|
|
LOB |
|
LOBの全体または一部を別のLOBにコピーします。 |
|
指定のオフセットから開始して、LOBの一部を消去します。 |
|
永続LOBの指定されたオフセットに |
|
LOBを切り捨てます。 |
|
LOBの指定されたオフセットにバッファのデータを書き込みます。 |
|
バッファのデータをLOBの終わりに書き込みます。 |
表13-29 Pro*COBOL: LOBのイントロスペクションに使用する埋込みSQL文
| 文 | 説明 |
|---|---|
|
書込み用のチャンク・サイズを取得します。 |
|
LOBまたは |
|
|
表13-30 Pro*COBOL: 一時LOBを操作する埋込みSQL文
| 文 | 説明 |
|---|---|
|
一時LOBを作成します。 |
|
LOBロケータが一時LOBを参照しているかどうかをチェックします。 |
|
一時LOBを解放します。 |
表13-31 Pro*COBOL: BFILE固有の埋込みSQL文
| 文 | 説明 |
|---|---|
|
オープンしているすべての |
|
|
|
|
表13-32 Pro*COBOL: LOBロケータ埋込みSQL文
| 文 | 説明 |
|---|---|
|
LOBロケータを別のLOBロケータに割り当てます。 |
|
|
表13-33 Pro*COBOL: LOBバッファリングのための埋込みSQL文
| 文 | 説明 |
|---|---|
|
バッファリング・サブシステムを使用禁止にします。 |
|
後続のLOBデータの読取り/書込みに、LOBバッファリング・サブシステムを使用します。 |
|
LOBバッファリング・サブシステムへの変更を、データベース(サーバー)へフラッシュします。 |
Java(JDBC)を使用して、LOBに対して次の作業を行うことができます。
一時LOBの作成と操作、および表への永続LOBとしての保存。「JDBC: 一時LOB API」を参照してください。
次のクラスを介してJDBC APIを使用すると、Javaにおける永続LOBの全体、初め、中または終わりの部分に対する変更ができます。
oracle.sql.BLOB
oracle.sql.CLOB
これらのクラスは、LOB変更用のメソッドがあるJDBC 3.0仕様に応じてjava.sql.Blobおよびjava.sql.Clobインタフェースを実装します。これらには、LOB変更用のOracle固有のレガシー・メソッドも含まれます。これらのレガシー・メソッドは非推奨としてマークされています。
Oracle Databaseリリース11.1以降、JDKの最小サポート・バージョンはJDK5です。JDK5を使用するには、ojdbc5.jarをCLASSPATH内に配置します。JDK6を使用するには、ojdbc6.jarをCLASSPATH内に配置します。ojdbc5.jarはJDBC 3.0仕様をサポートし、ojdbc6.jarは、JDK6での新規仕様であるJDBC4.0仕様をサポートします。
これらのクラスによって提供されていないすべてのLOB機能は、PL/SQL DBMS_LOBパッケージへコールすることによってアクセスできます。この方法は、このマニュアルの例で繰り返し使用されています。
フェッチ中にLOBロケータと一緒にデータおよびメタデータ(長さおよびチャンク・サイズ)の一部をプリフェッチすると、サーバー・ラウンドトリップ数を削減できます。
SELECT解析、実行およびフェッチは1回のラウンドトリップで発生します。大きいLOB(プリフェッチ・サイズの5倍より大きい)では、ほとんど改善しません。
プリフェッチ・サイズを構成するには、oracle.jdbc.OracleConnectionに定数として定義されている接続プロパティoracle.jdbc.defaultLobPrefetchSizeを使用します。値-1を使用するとプリフェッチが無効になり、0を使用するとメタデータのみのプリフェッチが有効になり、0より大きい任意の値を指定すると、フェッチ操作時にロケータとともにプリフェッチされるBLOBのバイト数およびCLOBの文字数を表します。
oracle.jdbc.OracleStatementで定義されるメソッドを使用すると、特定の文のプリフェッチ・サイズを変更できます。
void setLobPrefetchSize(int size) throws SQLException;
文レベルの設定は、接続レベルの設定を上書きします。この設定は、サイズがプリフェッチするバイト数(またはCLOBの文字)を表す拡張defineColumnTypeメソッドを使用して列レベルで上書きされます。指定可能な値は接続プロパティと同様です。タイプは、CLOB列にOracleTypes.CLOBおよびBLOB列にOracleTypes.BLOBを設定する必要があります。値が-1未満の場合、このメソッドではSQLExceptionが発生します。文を補うには、oracle.jdbc.OracleStatement内の次を使用できます。
int getLobPrefetchSize();
ゼロコピー入力/出力プロトコルを使用すると、SecureFilesのパフォーマンスを改善できます。これは、新しいNet NSデータ転送プロトコルをサポートしているネットワーク・クライアントでのみ使用できます。
LOBがSecureFilesかどうかを判別するには、次のメソッドを使用します。
public boolean isSecureFile() throws SQLException
SecureFilesの場合、TRUEが戻ります。
このThin接続プロパティを使用すると、ゼロコピー入力/出力プロトコルを無効にできます(FALSEに設定)。
oracle.net.useZeroCopyIO
Oracle Net Servicesでは、ローカル・バッファとの間でデータ転送のやりとりをしなくても、Oracle Net Servicesユーザーにより提供されるデータ・バッファを使用できるようになりました。
ネットワーク・バッファ(NS層)は省略され、内部LOBバッファが直接ネットワークに書き込まれます。バッファの読取りも、同様です。
この機能を使用できるのは、新規NSデータ・パケットをサポートするネットワーク・クライアントのみです(これはNSハンドシェイク中にネゴシエーションされます)。Thinドライバは新規NSプロトコルをサポートしているため、サーバーはゼロコピー・プロトコルを使用できます。また、JavaNetによってゼロコピーIOメカニズムが上位層に公開されるため、Thinドライバ・コードではデータ・コピーは必要なくなります。
BLOB.getBytes(long pos, int length, byte[] buffer)APIをコールすると、指定されたバッファをJavaNet層で使用してバイトがソケットから読み込まれます。
データは1回のラウンドトリップで取得されます。同様に、書込み操作中にBLOB.setBytes(long pos, byte[] bytes)をコールすると、バッファは直接JavaNet層のネットワーク上に書き込まれます。したがって、データは1回のラウンドトリップで書き込まれます。ユーザー・バッファは、まとめて送信されます。
次の2つの方法で、前述のすべてのLOBを参照できます。
OracleResultSetの列として
OraclePreparedStatementのOUT型PL/SQLパラメータとして
OracleResultSetの一部としてBLOBオブジェクトとCLOBオブジェクトが取り出された場合、これらのオブジェクトは現在選択されている行のLOBロケータを表します。
移動操作(rset.next()など)によってカレント行が変更されても、取り出されたロケータは元のLOB行を参照したままです。
最新のカレント行のロケータを取り出すには、移動操作を行うたびに、インスタンスがBLOB、CLOBまたはBFILEのいずれであるかに応じて、OracleResultSet上でgetBLOB()、getCLOB()またはgetBFILE()をコールする必要があります。
LOBでのJDBCの使用に関するJDBC構文および詳細は、次のドキュメントを参照してください。
関連項目:
パラメータ、パラメータ・タイプ、戻り値およびサンプル・コードの詳細は、『Oracle Database JDBC開発者ガイド』を参照してください。
表13-35 JDBC: BLOB値を変更するoracle.sql.BLOBメソッド
| メソッド | 説明 |
|---|---|
|
指定されたオフセットから、バイト配列を |
表13-36 JDBC: BLOB値の読取りまたはテストを行うoracle.sql.BLOBメソッド
| メソッド | 説明 |
|---|---|
|
指定されたオフセットから、バイトの配列としてLOBの内容を取得します。 |
|
LOB内の指定されたバイト配列を、指定されたオフセットで検索します。 |
|
指定された |
|
このLOBを別のLOBと比較します。LOBロケータを相互に比較します。 |
|
LOBの長さを戻します。 |
|
LOBのチャンク・サイズを戻します。 |
表13-37 JDBC: BLOBバッファリングのためのoracle.sql.BLOBメソッドおよびプロパティ
| メソッド | 説明 |
|---|---|
|
LOBをバイナリ・ストリームとして流すストリームを戻します。 |
|
この |
表13-38 JDBC: CLOB値を変更するoracle.sql.CLOBメソッド
| メソッド | 説明 |
|---|---|
|
JDBC 3.0: この |
|
指定されたオフセットから、文字配列をLOBに挿入します。 |
表13-39 JDBC: CLOB値の読取りまたはテストを行うoracle.sql.CLOBメソッド
| メソッド | 説明 |
|---|---|
|
LOBの部分文字列を文字列として戻します。 |
|
LOBのサブセットを文字配列に読み取ります。 |
|
指定された文字列をLOB内の指定されたオフセットから検索します。 |
|
指定された |
|
LOBの長さを戻します。 |
|
|
表13-40 JDBC: CLOBバッファリングのためのoracle.sql.CLOBメソッドおよびプロパティ
| メソッド | 説明 |
|---|---|
|
|
|
JDBC 3.0: この |
|
|
|
JDBC 3.0: この |
表13-41 JDBC: 外部LOB(BFILE)値の読取りまたはテストを行うoracle.sql.BFILEメソッド
| メソッド | 説明 |
|---|---|
|
|
|
|
|
指定されたオフセットから、LOB内の指定された |
|
指定されたオフセットから、 |
|
|
|
この |
|
この |
|
この |
|
|
|
この |
|
この |
表13-42 JDBC: BFILEバッファリングのためのoracle.sql.BFILEメソッドおよびプロパティ
| メソッド | 説明 |
|---|---|
|
|
Oracle Database JDBCドライバには、一時LOBを作成およびクローズするためのAPIが含まれます。これらのAPIによって、以前のリリースで使用していたDBMS_LOB PL/SQLパッケージの次のプロシージャを使用する必要がなくなります。
DBMS_LOB.createTemporary()
DBMS_LOB.isTemporary()
DBMS_LOB.freeTemporary()
表13-43 JDBC: 一時BLOB API
| メソッド | 説明 |
|---|---|
|
一時 |
|
指定の |
|
現行の |
|
指定の一時 |
|
一時 |
表13-44 JDBC: 一時CLOB API
| メソッド | 説明 |
|---|---|
|
一時 |
|
指定の |
|
現行の |
|
指定の一時 |
|
一時 |
oracle.sql.CLOBクラスは、標準JDBCのjava.sql.ClobインタフェースをOracle JDBCドライバに実装したものです。表13-44は、oracle.sql.CLOBで一時CLOBにアクセスするためのOracle拡張APIを示しています。
Oracle DatabaseのJDBCドライバには、明示的にLOBをオープンおよびクローズするためのAPIが含まれます。これらのAPIによって、以前のDBMS_LOB.open()およびDBMS_LOB.close()を使用する必要がなくなります。
oracle.sql.BLOBクラスは、標準JDBCのjava.sql.BlobインタフェースをOracle JDBCドライバに実装したものです。表13-45は、oracle.sql.BLOBでBLOBをオープンおよびクローズするためのOracle拡張APIを示しています。
表13-45 JDBC: BLOBのオープンおよびクローズ
| メソッド | 説明 |
|---|---|
|
|
|
|
|
|
JDBCアプリケーションは、oracle.sql.BLOBクラスに定義されているOPENメソッドを使用してBLOBをオープンできます。OPENメソッドの定義は次のとおりです。
/** * Open a BLOB in the indicated mode. Valid modes include MODE_READONLY, * and MODE_READWRITE. It is an error to open the same LOB twice. */ public void open (int mode) throws SQLException
MODEパラメータに指定可能な値は次のとおりです。
public static final int MODE_READONLY public static final int MODE_READWRITE
OPENをコールするたびにBLOBがオープンします。次に例を示します。
BLOB blob = ... blob.open (BLOB.MODE_READWRITE);
JDBCアプリケーションは、oracle.sql.BLOBに定義されているISOPENメソッドを使用して、BLOBがオープンしているかどうかを確認できます。戻されたブール値は、以前にBLOBがオープンされているかどうかを示します。isOpenメソッドは次のように定義します。
/** * Check whether the BLOB is opened. * @return true if the LOB is opened. */ public boolean isOpen () throws SQLException
次に例を示します。
BLOB blob = ... // See if the BLOB is opened boolean isOpen = blob.isOpen ();
oracle.sql.CLOBクラスは、標準JDBCのjava.sql.ClobインタフェースをOracle JDBCドライバに実装したものです。表13-46は、oracle.sql.CLOBでCLOBをオープンおよびクローズするためのOracle拡張APIを示しています。
表13-46 JDBC: CLOBのオープンおよびクローズ
| メソッド | 説明 |
|---|---|
|
|
|
|
|
|
JDBCアプリケーションは、oracle.sql.CLOBクラスに定義されているOPENメソッドを使用してCLOBをオープンできます。OPENメソッドの定義は次のとおりです。
/** * Open a CLOB in the indicated mode. Valid modes include MODE_READONLY, * and MODE_READWRITE. It is an error to open the same LOB twice. */ public void open (int mode) throws SQLException
MODEパラメータに指定可能な値は次のとおりです。
public static final int MODE_READONLY public static final int MODE_READWRITE
OPENをコールするたびにCLOBがオープンします。次に例を示します。
CLOB clob = ... clob.open (CLOB.MODE_READWRITE);
JDBCアプリケーションは、oracle.sql.CLOBに定義されているISOPENメソッドを使用して、CLOBがオープンしているかどうかを確認できます。戻されたブール値は、以前にCLOBがオープンされているかどうかを示します。isOpenメソッドは次のように定義します。
/** * Check whether the CLOB is opened. * @return true if the LOB is opened. */ public boolean isOpen () throws SQLException
次に例を示します。
CLOB clob = ... // See if the CLOB is opened boolean isOpen = clob.isOpen ();
oracle.sql.BFILEクラスは、データベースBFILEオブジェクトをラップします。表13-47は、oracle.sql.BFILEでBFILEをオープンおよびクローズするOracle拡張APIを示しています。
表13-47 BFILEをオープンおよびクローズするためのJDBC拡張API
| メソッド | 説明 |
|---|---|
|
|
|
|
|
|
|
|
JDBCアプリケーションは、oracle.sql.BFILEクラスに定義されているOPENメソッドを使用してBFILEをオープンできます。OPENメソッドの定義は次のとおりです。
/** * Open a external LOB in the read-only mode. It is an error * to open the same LOB twice. */ public void open () throws SQLException /** * Open a external LOB in the indicated mode. Valid modes include * MODE_READONLY only. It is an error to open the same * LOB twice. */ public void open (int mode) throws SQLException
MODEパラメータに指定可能な値は次のとおりです。
public static final int MODE_READONLY
OPENをコールするたびにBFILEがオープンします。次に例を示します。
BFILE bfile = ... bfile.open ();
JDBCアプリケーションでBFILEがオープンしているかどうかを確認するには、oracle.sql.BFILEで定義されているisOpenメソッドを使用します。戻されたブール値は、以前にBFILEがオープンされているかどうかを示します。isOpenメソッドは次のように定義します。
/** * Check whether the BFILE is opened. * @return true if the LOB is opened. */ public boolean isOpen () throws SQLException
次に例を示します。
BFILE bfile = ... // See if the BFILE is opened boolean isOpen = bfile.isOpen ();
JDBCアプリケーションは、oracle.sql.BFILEに定義されているCLOSEメソッドを使用してBFILEをクローズできます。CLOSE APIの定義は次のとおりです。
/** * Close a previously opened BFILE. */ public void close () throws SQLException
次に例を示します。
BFILE bfile = ... // close the BFILE bfile.close ();
/*
* This sample shows how to open/close BLOB and CLOB.
*/
// You must import the java.sql package to use JDBC
import java.sql.*;
// You must import the oracle.sql package to use oracle.sql.BLOB
import oracle.sql.*;
class OpenCloseLob
{
public static void main (String args [])
throws SQLException
{
// Load the Oracle JDBC driver
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
String url = "jdbc:oracle:oci8:@";
try {
String url1 = System.getProperty("JDBC_URL");
if (url1 != null)
url = url1;
} catch (Exception e) {
// If there is any security exception, ignore it
// and use the default
}
// Connect to the database
Connection conn =
DriverManager.getConnection (url, "scott", "password");
// It is faster when auto commit is off
conn.setAutoCommit (false);
// Create a Statement
Statement stmt = conn.createStatement ();
try
{
stmt.execute ("drop table basic_lob_table");
}
catch (SQLException e)
{
// An exception could be raised here if the table did not exist.
}
// Create a table containing a BLOB and a CLOB
stmt.execute ("create table basic_lob_table (x varchar2 (30), b blob, c clob)");
// Populate the table
stmt.execute (
"insert into basic_lob_table values"
+ " ('one', '010101010101010101010101010101', 'onetwothreefour')");
// Select the lobs
ResultSet rset = stmt.executeQuery ("select * from basic_lob_table");
while (rset.next ())
{
// Get the lobs
BLOB blob = (BLOB) rset.getObject (2);
CLOB clob = (CLOB) rset.getObject (3);
// Open the lobs
System.out.println ("Open the lobs");
blob.open (BLOB.MODE_READWRITE);
clob.open (CLOB.MODE_READWRITE);
// Check if the lobs are opened
System.out.println ("blob.isOpen()="+blob.isOpen());
System.out.println ("clob.isOpen()="+clob.isOpen());
// Close the lobs
System.out.println ("Close the lobs");
blob.close ();
clob.close ();
// Check if the lobs are opened
System.out.println ("blob.isOpen()="+blob.isOpen());
System.out.println ("clob.isOpen()="+clob.isOpen());
}
// Close the ResultSet
rset.close ();
// Close the Statement
stmt.close ();
// Close the connection
conn.close ();
}
}
Oracle DatabaseのJDBCドライバには、永続LOBを切り捨てるためのAPIが含まれています。これによって、以前のDBMS_LOB.trim()を使用する必要がなくなります。
oracle.sql.BLOBクラスは、標準JDBCのjava.sql.BlobインタフェースをOracle JDBCドライバに実装したものです。表13-48は、oracle.sql.BLOBでBLOBを切り捨てるためのOracle拡張APIを示しています。
表13-48 JDBC: BLOBの切捨て
| メソッド | 説明 |
|---|---|
|
|
TRUNCATE APIの定義は次のとおりです。
/** *Truncate the value of the BLOB to the length you specify in the newlen parameter. * @param newlen the new length of the BLOB. */ public void truncate (long newlen) throws SQLException
newlenパラメータにBLOBの新しい長さを指定します。
oracle.sql.CLOBクラスは、標準JDBCのjava.sql.ClobインタフェースをOracle JDBCドライバに実装したものです。表13-49は、oracle.sql.CLOBでCLOBを切り捨てるためのOracle拡張APIを示しています。
表13-49 JDBC: CLOBの切捨て
| メソッド | 説明 |
|---|---|
|
|
TRUNCATE APIの定義は次のとおりです。
/** *Truncate the value of the CLOB to the length you specify in the newlen parameter. * @param newlen the new length of the CLOB. */ public void truncate (long newlen) throws SQLException
newlenパラメータにCLOBの新しい長さを指定します。
関連項目:
例は、「LOBデータの切捨てについて」を参照してください。
データベースに用意されているJDBCインタフェースには、要求された位置でJavaストリームからのLOBの読取りおよび書込みを行うためのLOBストリーミングAPIが含まれています。
oracle.sql.BLOBクラスは、標準JDBCのjava.sql.Blobインタフェースを実装したものです。表13-50は、BLOBストリーミングAPIを示しています。
表13-50 JDBC: BLOBストリーミングAPI
| メソッド | 説明 |
|---|---|
|
JDBC 3.0: この |
|
JDBC 3.0: この |
|
Oracle拡張機能: この |
これらのAPIの定義は次のとおりです。
/** * Write to the BLOB from a stream at the requested position. * * @param pos is the position data to be put. * @return a output stream to write data to the BLOB */ public java.io.OutputStream setBinaryStream(long pos) throws SQLException /** * Read from the BLOB as a stream at the requested position. * * @param pos is the position data to be read. * @return a output stream to write data to the BLOB */ public java.io.InputStream getBinaryStream(long pos) throws SQLException
oracle.sql.CLOBクラスは、標準JDBCのjava.sql.ClobインタフェースをOracle JDBCドライバに実装したものです。表13-51は、CLOBストリーミングAPIを示しています。
表13-51 JDBC: CLOBストリーミングAPI
| メソッド | 説明 |
|---|---|
|
JDBC 3.0: この |
|
JDBC 3.0: この |
|
JDBC 3.0: この |
|
Oracle拡張機能: この |
|
JDBC 3.0: この |
|
Oracle拡張機能: この |
これらのAPIの定義は次のとおりです。
/** * Write to the CLOB from a stream at the requested position. * @param pos is the position data to be put. * @return a output stream to write data to the CLOB */ public java.io.OutputStream setAsciiStream(long pos) throws SQLException /**
* Write to the CLOB from a stream at the requested position.
* @param pos is the position data to be put.
* @return a output stream to write data to the CLOB
*/
public java.io.Writer setCharacterStream(long pos) throws SQLException
/**
* Read from the CLOB as a stream at the requested position.
* @param pos is the position data to be put.
* @return a output stream to write data to the CLOB
*/
public java.io.InputStream getAsciiStream(long pos) throws SQLException
/**
* Read from the CLOB as a stream at the requested position.
* @param pos is the position data to be put.
* @return a output stream to write data to the CLOB
*/
public java.io.Reader getCharacterStream(long pos) throws SQLException
oracle.sql.BFILEクラスは、データベースBFILEをラップします。表13-52は、oracle.sql.BFILEでBFILEの内容を、要求された位置から読み取るOracle拡張APIを示しています。
表13-52 JDBC: BFILEストリーミングAPI
| メソッド | 説明 |
|---|---|
|
|
これらのAPIの定義は次のとおりです。
/** * Read from the BLOB as a stream at the requested position. * * @param pos is the position data to be read. * @return a output stream to write data to the BLOB */ public java.io.InputStream getBinaryStream(long pos) throws SQLException
/*
* This sample shows how to read/write BLOB and CLOB as streams.
*/
import java.io.*;
// You must import the java.sql package to use JDBC
import java.sql.*;
// You must import the oracle.sql package to use oracle.sql.BLOB
import oracle.sql.*;
class NewStreamLob
{
public static void main (String args []) throws Exception
{
// Load the Oracle JDBC driver
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
String url = "jdbc:oracle:oci8:@";
try {
String url1 = System.getProperty("JDBC_URL");
if (url1 != null)
url = url1;
} catch (Exception e) {
// If there is any security exception, ignore it
// and use the default
}
// Connect to the database
Connection conn =
DriverManager.getConnection (url, "scott", "password");
// It is faster when auto commit is off
conn.setAutoCommit (false);
// Create a Statement
Statement stmt = conn.createStatement ();
try
{
stmt.execute ("drop table basic_lob_table");
}
catch (SQLException e)
{
// An exception could be raised here if the table did not exist.
}
// Create a table containing a BLOB and a CLOB
stmt.execute (
"create table basic_lob_table"
+ "(x varchar2 (30), b blob, c clob)");
// Populate the table
stmt.execute (
"insert into basic_lob_table values"
+ "('one', '010101010101010101010101010101', 'onetwothreefour')");
System.out.println ("Dumping lobs");
// Select the lobs
ResultSet rset = stmt.executeQuery ("select * from basic_lob_table");
while (rset.next ())
{
// Get the lobs
BLOB blob = (BLOB) rset.getObject (2);
CLOB clob = (CLOB) rset.getObject (3);
// Print the lob contents
dumpBlob (conn, blob, 1);
dumpClob (conn, clob, 1);
// Change the lob contents
fillClob (conn, clob, 11, 50);
fillBlob (conn, blob, 11, 50);
}
rset.close ();
System.out.println ("Dumping lobs again");
rset = stmt.executeQuery ("select * from basic_lob_table");
while (rset.next ())
{
// Get the lobs
BLOB blob = (BLOB) rset.getObject (2);
CLOB clob = (CLOB) rset.getObject (3);
// Print the lobs contents
dumpBlob (conn, blob, 11);
dumpClob (conn, clob, 11);
}
// Close all resources
rset.close();
stmt.close();
conn.close();
}
// Utility function to dump Clob contents
static void dumpClob (Connection conn, CLOB clob, long offset)
throws Exception
{
// get character stream to retrieve clob data
Reader instream = clob.getCharacterStream(offset);
// create temporary buffer for read
char[] buffer = new char[10];
// length of characters read
int length = 0;
// fetch data
while ((length = instream.read(buffer)) != -1)
{
System.out.print("Read " + length + " chars: ");
for (int i=0; i<length; i++)
System.out.print(buffer[i]);
System.out.println();
}
// Close input stream
instream.close();
}
// Utility function to dump Blob contents
static void dumpBlob (Connection conn, BLOB blob, long offset)
throws Exception
{
// Get binary output stream to retrieve blob data
InputStream instream = blob.getBinaryStream(offset);
// Create temporary buffer for read
byte[] buffer = new byte[10];
// length of bytes read
int length = 0;
// Fetch data
while ((length = instream.read(buffer)) != -1)
{
System.out.print("Read " + length + " bytes: ");
for (int i=0; i<length; i++)
System.out.print(buffer[i]+" ");
System.out.println();
}
// Close input stream
instream.close();
}
// Utility function to put data in a Clob
static void fillClob (Connection conn, CLOB clob, long offset, long length)
throws Exception
{
Writer outstream = clob.setCharacterStream(offset);
int i = 0;
int chunk = 10;
while (i < length)
{
outstream.write("aaaaaaaaaa", 0, chunk);
i += chunk;
if (length - i < chunk)
chunk = (int) length - i;
}
outstream.close();
}
// Utility function to put data in a Blob
static void fillBlob (Connection conn, BLOB blob, long offset, long length)
throws Exception
{
OutputStream outstream = blob.setBinaryStream(offset);
int i = 0;
int chunk = 10;
byte [] data = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
while (i < length)
{
outstream.write(data, 0, chunk);
i += chunk;
if (length - i < chunk)
chunk = (int) length - i;
}
outstream.close();
}
}
oracle.sql.BLOBにある次のAPIを使用すると、空のBLOBを作成できます。
public static BLOB empty_lob () throws SQLException
同様に、oracle.sql.CLOBにある次のAPIを使用すると、空のCLOBを作成できます。
public static CLOB empty_lob () throws SQLException
JDBCドライバを使用すると、データベースをラウンドトリップさせることなく、空のLOBインスタンスを作成できます。空のLOBは、次の場合に使用できます。
PreparedStatementの設定API
更新可能な結果セットの更新API
STRUCTの属性値
ARRAYの要素値
注意:
空のLOBは特別なマーカーとしてのLOBであり、実際のLOB値ではありません。
JDBCアプリケーションでは、前述のAPIから作成された空のLOBに対する読取りまたは書込みを実行できません。アプリケーションが空のLOBに対する読取りまたは書込みを実行しようとすると、ORA-17098「空のLOBに対する操作は無効です」が表示されます。
OraOLEDBは、OLE DBおよびADOの開発者に高いパフォーマンス、およびOracleデータへの効率的なアクセスを提供します。
COM、C++または任意のCOMクライアントを使用してプログラムを作成する開発者は、OraOLEDBを使用してOracleデータベースにアクセスできます。
OraOLEDBは、OracleのためのOLE DBプロバイダです。これは、高いパフォーマンス、およびLOBなどのOracleデータへの効率的なアクセスを提供します。また、これを使用して特定のLOB型に更新することもできます。
OraOLEDBは、次のLOB型をサポートします。
永続LOBの場合:
行セット全体でのREAD/WRITE。
BFILEの場合:
行セット全体での読取り専用
一時LOBの場合:
行セット全体ではサポートされません。
関連項目:
『Oracle Provider for OLE DB開発者ガイド for Microsoft Windows』
Oracle Data Provider for .NET(ODP.NET)は、Oracleデータベース用のデータ・プロバイダの実装です。
ODP.NETでは、Oracle固有のAPIを使用した.NETアプリケーションからOracleのデータおよび機能への、高速で信頼性の高いアクセスが提供されます。また、ODP.NETは、Microsoft .NET Framework Class Libraryで使用可能なクラスとインタフェースを使用し、継承します。ODP.NETでは、LOB(BLOB、CLOB、NCLOBおよびBFILE)が.NETを使用する固有のデータ型としてサポートされます。
COMおよび.NETは補足的な開発テクノロジです。Microsoftでは、新規開発にはCOMではなく.NET Frameworkを使用することを開発者に薦めています。
関連項目:
Oracle Data Provider for .NETの開発者ガイド