10 LOB APIの概要
LOBをサポートするために複数のAPIが用意されています。
内容は次のとおりです。
10.1 LOBをサポートするプログラム環境
表10-1に、LOB機能をサポートするプログラム環境を示します。
表10-1 LOBをサポートするプログラム環境
言語 | プリコンパイラまたはインタフェース・プログラム | 関連セクション | 関連書籍 |
---|---|---|---|
DBMS_LOBパッケージ |
|||
Oracle Call Interface for C (OCI) |
|||
C++ |
Oracle Call Interface for C++ (OCCI) |
||
Pro*C/C++プリコンパイラ |
|||
Pro*COBOLプリコンパイラ |
|||
JDBC API |
|||
ADO/OLE DB |
Oracle Provider for OLE DB(OraOLEDB)。 |
『Microsoft Windows用Oracle Provider for OLE DB開発者ガイド for Microsoft Windows』 |
|
.NET |
Oracle Data Provider for .NET(ODP.NET) |
10.2 LOBインタフェースの比較
表10-2および表10-3では、8つのプログラム用LOBインタフェースについて、LOB操作に使用するそれぞれのファンクションおよびメソッドをリストし、比較しています。表が2つに分かれているのは、単に8つのインタフェースすべてを記載するためです。これらのインタフェースのLOBに関する機能については、この後の項で説明します。
表10-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 |
該当なし |
|
|
該当なし |
|
|
|
|
|
|
|
|
|
|
|
該当なし |
|
|
|
|
|
|
|
|
|
|
該当なし |
|
|
|
該当なし |
該当なし |
|
|
該当なし |
該当なし |
|
|
該当なし |
該当なし |
該当なし |
|
演算子= ( )またはコピー・コンストラクタを使用 |
該当なし |
表10-3 LOBインタフェースの比較(2/2)
PL/SQL:DBMS_LOB(dbmslob.sql) | Java (JDBC) | ODP.NET |
---|---|---|
|
|
|
|
position |
|
|
|
該当なし |
|
|
|
|
利用不可(等号を使用) |
|
|
該当なし |
該当なし |
|
該当なし |
該当なし |
|
|
|
|
readおよびwriteを使用 |
|
|
|
|
|
|
|
|
|
該当なし |
|
|
|
|
|
|
|
|
|
|
Use |
|
|
|
|
|
|
|
|
該当なし |
該当なし |
|
|
|
該当なし |
|
該当なし |
|
|
|
|
|
該当なし |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
該当なし |
|
|
該当なし |
|
|
該当なし |
|
10.3 PL/SQL(DBMS_LOBパッケージ)を使用したLOBの作業
PL/SQL DBMS_LOB
パッケージは、次の操作のために使用できます。
-
内部永続LOBおよび一時LOB: 全体またはピース単位の読取りおよび変更操作。
-
BFILE: 読取り操作
関連項目:
パラメータ、パラメータ・タイプ、戻り値およびサンプル・コードの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
10.3.1 DBMS_LOBルーチン実行前のLOBロケータの提供
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
ルーチンで提供されている例を使用して、前述の操作について説明します。
関連項目:
10.3.2 DBMS_LOB操作のオフセット・パラメータおよび量パラメータのガイドライン
DBMS_LOB
PL/SQLパッケージのプロシージャで使用されるオフセット・パラメータと量パラメータには、次のガイドラインが適用されます。
-
文字データ(すべての形式、固定幅および可変幅)の場合、
amount
パラメータとoffset
パラメータは文字単位です。これは、CLOB
データ型とNCLOB
データ型に対する操作に適用されます。 -
バイナリ・データの場合、
offset
パラメータとamount
パラメータはバイト単位です。このガイドラインはBLOB
データ型に対する操作に適用されます。 -
次のプロシージャを使用する場合のガイドライン
量パラメータには、ロード元の
BFILE
のサイズを超える値を指定できません。これらのプロシージャを使用してBFILE
全体をロードするには、BFILE
の正確なサイズまたは最大許容記憶域の上限を指定する必要があります。 -
DBMS_LOB.READ
を使用する場合、amount
パラメータはデータより大きいサイズに指定できます。バッファ・サイズ以下の値を指定する必要があります。バッファ・サイズの上限は32KBです。
10.3.3 文字セットIDの取得
文字セット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パッケージ・プロシージャおよびタイプ・リファレンス』 を参照してください。
-
サポートされている言語は、『Oracle Databaseグローバリゼーション・サポート・ガイド』 を参照してください。
10.3.4 LOB用のPL/SQLファンクションおよびプロシージャ
関連項目:
BLOB
、CLOB
、NCLOB
およびBFILE
を操作するPL/SQLファンクションおよびプロシージャの概要は、次のとおりです
10.3.5 LOB値を変更するPL/SQLファンクションおよびプロシージャ
次の表に、DBMS_LOB
プロシージャを示します。
表10-4 PL/SQL: LOB値を変更するDBMS_LOBプロシージャ
ファンクションおよびプロシージャ | 説明 |
---|---|
|
LOB値を別のLOBに追加します。 |
|
|
|
|
|
LOBの全体または一部を他のLOBにコピーします。 |
|
指定のオフセットから開始して、LOBの一部を消去します。 |
|
LOBの指定されたオフセットから指定された長さのデータを削除します。 |
|
LOBの指定されたオフセットに、指定されたデータ(32KB未満)を挿入します。 |
|
指定されたオフセットから他の指定されたオフセットに、指定されたバイト数を移動します。 |
|
指定されたオフセットのデータを、指定されたデータ(32KB未満)と置換します。 |
|
|
|
文字セットをファイルからLOBにロードします。 |
|
バイナリ・データをファイルからLOBにロードします。 |
|
LOB機能(重複除外および圧縮)を設定します。 |
|
指定された長さまでLOB値を切り捨てます。 |
|
指定されたオフセットからLOBにデータを書き込みます。 |
|
データをLOBの終わりに書き込みます。 |
10.3.6 LOBのイントロスペクションに使用するPL/SQLファンクションおよびプロシージャ
表10-5 PL/SQL: 内部LOBおよび外部LOBの値の読取りまたはテストを行うDBMS_LOBプロシージャ
ファンクションおよびプロシージャ | 説明 |
---|---|
|
2つのLOBの値を比較します。 |
|
読取りおよび書込み用にチャンク・サイズを取得します。これは永続LOBにのみ適用され、外部LOB( |
|
LOB値の長さを取得します。 |
|
SecureFilesのオプション(重複除外、圧縮、暗号化)を戻します。 |
|
データベース構成のLOB記憶域制限を取得します。 |
|
LOBにおけるパターンのn番目の出現位置を戻します。 |
|
このファンクションは、渡される |
|
指定されたオフセットからLOBのデータを読み取ります。 |
|
デフォルトのLOB列の設定を上書きする、SecureFilesのオプション(重複除外および圧縮)を設定します。サーバーへのラウンドトリップが発生します。 |
|
指定されたオフセットからLOB値の一部を戻します。 |
10.3.7 一時LOBに対するPL/SQL操作
表10-6 PL/SQL: 一時LOBを操作するDBMS_LOBプロシージャ
ファンクションおよびプロシージャ | 説明 |
---|---|
CREATETEMPORARY |
一時LOBを作成します。 |
ISTEMPORARY |
LOBロケータが一時LOBを参照するかどうかを確認します。 |
FREETEMPORARY |
一時LOBを解放します。 |
10.3.8 PL/SQL: BFILE固有の読取り専用ファンクションおよびプロシージャ
表10-7 PL/SQL: BFILE固有のDBMS_LOB読取り専用プロシージャ
ファンクションおよびプロシージャ | 説明 |
---|---|
|
ファイルをクローズします。 |
|
オープンしていたすべてのファイルをクローズします。 |
|
ファイルがサーバー上に存在するかどうかを確認します。 |
|
ディレクトリ・オブジェクト名とファイル名を取得します。 |
|
入力 |
|
ファイルをオープンします。 |
10.3.9 PL/SQL: 内部LOBおよび外部LOBをオープンおよびクローズするファンクションおよびプロシージャ
表10-8 PL/SQL: 内部LOBおよび外部LOBをオープンおよびクローズするDBMS_LOBプロシージャ
ファンクションおよびプロシージャ | 説明 |
---|---|
|
LOBをオープンします |
|
LOBがオープンしているかどうかを確認します。 |
|
LOBをクローズします |
関連項目:
LOBを含む行のINSERT
など、特定のLOB操作の手順については、「OPENおよびCLOSEインタフェースを使用した永続LOBのオープン」を参照してください
10.4 OCIを使用したLOBの作業
Oracle Call Interface(OCI)のLOB関数を使用すると、CでLOBにアクセスして変更し、BFILE
からデータを読み取ることができます。
関連項目:
この項で説明するすべての内容の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』の「LOBおよびBFILEの操作」の章を参照してください。
10.4.1 LOBデータ、長さおよびチャンク・サイズのプリフェッチ
小さいLOBのOCIアクセスを改善するために、LOBデータをプリフェッチしてキャッシュする間にロケータもフェッチできます。これは内部LOB、一時LOBおよびBFILE
に適用されます。
10.4.2 OCI LOB APIのCSIDパラメータの設定
データを2バイトのUnicodeフォーマットで読取りまたは書込みする場合は、OCILobRead2()
およびOCILobWrite2()
のcsid
(文字セットID)パラメータをOCI_UTF16ID
に設定します。
csid
パラメータは、バッファ・パラメータ用の文字セットidを示します。csid
パラメータは、どの文字セットIDにも設定できます。csid
パラメータが設定されていると、環境変数NLS_LANG
より優先されます。
関連項目:
-
OCIUnicodeToCharSet()
関数の説明およびOCI構文全般の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。 -
異なる言語におけるアプリケーションの実装の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
10.4.3 OCIにおける固定幅文字セットと可変幅文字セットの規則
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
に書き込まれた文字数を表します。
-
10.4.3.1 他の操作
その他すべてのLOB操作については、クライアント側文字セットかどうかにかかわらず、量パラメータは
CLOB
およびNCLOB
については文字で表されます。これには、OCILobCopy2()
、OCILobErase2()
、OCILobLoadFromFile2()
およびOCILobTrim2()
が含まれます。これらのすべての操作では、サーバー上のLOBデータの量を参照します。
10.4.4 OCILobLoadFromFile2()の量パラメータ
OCILobLoadFromFile2()
を使用する場合、量パラメータに、
BFILE
の長さより長い値を指定することはできません。BFILE
全体をロードするには、OCILobGetStorageLimit()
の戻り値を渡します。
10.4.5 OCILobRead2()の量パラメータ
OCILobRead2()
を使用してLOBの終わりまで読み取るには、OCILobGetStorageLimit()
の戻り値と等しい量を指定します。
関連項目:
10.4.6 OCILobLocatorポインタの割当て
OCIプログラムでOCILobLocator
ポインタを割り当てる場合は、特殊事例として=代入演算子を使用する必要があります。ポインタ割当てにより、LOBの簡単なコピーが作成されます。ポインタの割当て後は、ソースLOBとターゲットLOBが同じデータ・コピーを指します。
これらのセマンティクスは、割当ての実行にOCILobAssign()
やOCILobLocatorAssign()
などのLOB APIを使用する場合とは異なります。これらのAPIを使用すると、割当て後のロケータは独立したデータ・コピーを論理的に指します。
一時LOBの場合は、ポインタ割当てを実行する前にOCIFreeTemporary()
をコールして、ターゲットLOBロケータ内の一時LOBが解放されていることを確認する必要があります。これに対して、OCILobLocatorAssign()
を使用すると、割当てが発生する前に、ターゲットLOBロケータ変数内の元の一時LOB(存在する場合)が自動的に解放されます。
10.4.8 OCI: BLOB、CLOB、NCLOBおよびBFILEを操作する関数
BLOB
、CLOB
、NCLOB
およびBFILE
を操作するOCI関数は、次のとおりです。
-
永続LOBを変更するには、**INTERNAL XREF ERROR**を参照してください。
-
LOB値の読取りまたは調査を行うには、**INTERNAL XREF ERROR**を参照してください。
-
一時LOBの作成または解放、または一時LOBが存在するかどうかの確認は、**INTERNAL XREF ERROR**を参照してください。
-
外部LOB (
BFILE
)の読取り専用関数については、**INTERNAL XREF ERROR**を参照してください。 -
LOBロケータを操作するには、**INTERNAL XREF ERROR**を参照してください。
-
LOBをオープンおよびクローズするには、**INTERNAL XREF ERROR**を参照してください。
10.4.9 OCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更する関数
表10-9 OCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更する関数
ファンクションおよびプロシージャ | 説明 |
---|---|
|
LOB値を別のLOBに追加します。 |
|
1回のラウンドトリップで複数のロケータを使用してデータを書き込みます。 |
|
LOBの全体または一部を他のLOBにコピーします。 |
|
指定のオフセットから開始して、LOBの一部を消去します。 |
|
|
|
SecureFilesにコンテンツ文字列を設定します。 |
|
SecureFilesのオプション設定(重複除外および圧縮)を使用可能にします。 |
|
LOBを切り捨てます。 |
|
バッファのデータをLOBに書き込み、既存データを上書きします。 |
|
バッファのデータをLOBの終わりに書き込みます。 |
10.4.10 OCI: 永続LOBおよび外部LOB(BFILE)の値の読取りまたはテストを行う関数
表10-10 OCI: 永続LOBおよび外部LOB(BFILE)の値の読取りまたはテストを行う関数
ファンクションおよびプロシージャ | 説明 |
---|---|
|
1回のラウンドトリップで複数のロケータを使用してデータを読み取ります。 |
|
読取りおよび書込み用にチャンク・サイズを取得します。これは永続LOBに適用され、外部LOB( |
|
SecureFilesのコンテンツ文字列を取得します。 |
|
LOBまたは |
|
指定されたSecureFilesの使用可能な設定(重複除外、圧縮および暗号化)を取得します。 |
|
内部LOBの最大長を取得します。 |
|
|
10.4.11 OCI: 一時LOBを操作する関数
表10-11 OCI: 一時LOBを操作する関数
ファンクションおよびプロシージャ | 説明 |
---|---|
|
一時LOBを作成します。 |
|
一時LOBが存在するかどうかを確認します。 |
|
一時LOBを解放します。 |
10.4.12 OCI: BFILE固有の読取り専用関数
表10-12 OCI: BFILE固有の読取り専用関数
ファンクションおよびプロシージャ | 説明 |
---|---|
|
オープンしている |
|
オープンしているすべての |
|
|
|
|
|
|
|
|
10.4.13 OCI: LOBロケータ関数
表10-13 OCI: LOBロケータ関数
ファンクションおよびプロシージャ | 説明 |
---|---|
|
LOBロケータを別のLOBロケータに割り当てます。 |
|
LOBの文字セット・フォームを戻します。 |
|
LOBの文字セットIDを戻します。 |
|
|
|
2つのLOBロケータが同じLOBを参照しているかどうかを確認します。 |
|
LOBロケータが初期化されているかどうかを確認します。 |
10.4.14 OCI: 内部LOBおよび外部LOBをオープンおよびクローズする関数
表10-14 OCI: 内部LOBおよび外部LOBをオープンおよびクローズする関数
ファンクションおよびプロシージャ | 説明 |
---|---|
|
LOBをオープンします。 |
|
LOBがオープンしているかどうかを確認します。 |
|
LOBをクローズします。 |
10.4.15 OCI LOBの例
OCIの例は、次の章にも記載されています。
関連項目:
OCIのデモ・スクリプト・リストの詳細は、Oracle Call Interfaceプログラマーズ・ガイドを参照してください
10.5 C++(OCCI)を使用したLOBの作業
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への書込み
10.5.1 OCCIでLOBに使用するクラス
OCCIには、C++アプリケーションで各種のLOBインスタンスをオブジェクトとして使用できるように、次のクラスが用意されています。
-
Clob
クラス: 内部CLOB
および内部NCLOB
に格納されているデータにアクセスし、データを変更します。 -
Blob
クラス: 内部BLOB
に格納されているデータにアクセスし、データを変更します。 -
Bfile
クラス: 外部LOB(BFILE
)に格納されているデータにアクセスし、データを読み取ります。関連項目:
各クラスの構文情報とOCCIの一般的な詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』を参照してください。
10.5.1.1 Clobクラス
Clobドライバは、SQL LOBロケータを使用してCLOB
オブジェクトを実装します。これは、CLOBオブジェクトに、データ自体ではなくSQL CLOB
データへの論理ポインタが含まれていることを意味します。
CLOB
インタフェースでは、SQL CLOB
値の長さの取得、クライアント上のCLOB
値のマテリアライズ化、および部分文字列の取得を実行するためのメソッドが提供されます。ResultSet
インタフェースおよびStatement
インタフェースのgetClob()
やsetClob()
などのメソッドを使用すると、SQL CLOB
値にアクセスできます。
関連項目:
Clobクラスの詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』を参照してください。
10.5.1.2 Blobクラス
ResultSet
インタフェースおよびStatement
インタフェースのgetBlob()
やsetBlob()
などのメソッドを使用すると、SQL BLOB
値にアクセスできます。Blob
インタフェースでは、SQL BLOB
値の長さの取得、クライアント上のBLOB
値のマテリアライズ化、およびBLOB
の一部の抽出を実行するためのメソッドが提供されます。
関連項目:
-
Blobクラスのメソッドの詳細およびC++アプリケーションでのBlobオブジェクトのインスタンス化および初期化の詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』を参照してください。
-
異なる言語におけるアプリケーションの実装の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
10.5.1.3 Bfileクラス
Bfile
クラスを使用すると、C++アプリケーションでBfile
オブジェクトをインスタンス化できます。この場合、Bfile
クラスのメソッド(setName()
メソッドなど)を使用して、データベースのBFILE
列内のBFILE
型のオブジェクトにオブジェクト・プロパティを関連付けるBfile
オブジェクトを初期化する必要があります。
関連項目:
Bfile
クラスのメソッドの詳細およびC++アプリケーションでのBfile
オブジェクトのインスタンス化および初期化の詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』を参照してください。
10.5.2 固定幅文字セットの規則
OCCIの場合、固定幅のクライアント側文字セットには、次の規則が適用されます。
-
Clob
: オフセット・パラメータおよび量パラメータは、常に文字で表されます。 -
Blob
: オフセット・パラメータおよび量パラメータは、常にバイトで表されます。 -
Bfile
: オフセット・パラメータおよび量パラメータは、常にバイトで表されます。
10.5.3 可変幅文字セットの規則
次の規則は、可変幅のクライアント側文字セットに対してのみ適用されます。
-
オフセット・パラメータ: クライアント側文字セットが可変幅かどうかにかかわらず、オフセット・パラメータは常に次のように表されます。
-
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
に書き込まれた文字数を表します。
-
10.5.4 他のOCCI操作のためのオフセット・パラメータおよび量パラメータ
その他すべてのOCCI LOB操作については、クライアント側文字セットかどうかにかかわらず、量パラメータはCLOB
およびNCLOB
については文字で表されます。次のようなものがあります:
-
Clob.copy()
-
Clob.erase()
-
Clob.trim()
-
LoadFromFile
機能用にオーバーロードされたClob.copy()
これらのすべての操作では、サーバー上のLOBデータの量を参照します。
10.5.5 OCCI LOB copy()メソッドの量パラメータ
Clob
およびBlob
にcopy()
メソッドを使用すると、BFILE
からデータをロードできます。このメソッドの量パラメータには、次のいずれかの値を渡すことができます。
-
データの一部をロードする場合は、
BFILE
のサイズよりも小さい量。 -
データ全体をロードする場合は、
BFILE
のサイズと等しい量。 -
BFILE
データをすべてロードする場合は、UB8MAXVAL
定数
BFILE
のサイズより大きいサイズは指定できません。
10.5.6 OCCI read()操作の量パラメータ
Clob
、Blob
またはBfile
オブジェクトに対するread()
メソッドは、BFILE
からデータを読み取ります。量パラメータの次のいずれかの値を渡して、読み取るデータ量を指定できます。
-
データの一部をロードする場合は、
BFILE
のサイズよりも小さい量。 -
データ全体をロードする場合は、
BFILE
のサイズと等しい量。 -
BFILE
の終わりまでストリーム・モードで読み取る場合は、0
(ゼロ)
BFILE
のサイズより大きいサイズは指定できません。
10.5.9 OCCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更するメソッド
表10-15 OCCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更するClobメソッドおよびBlobメソッド
ファンクションおよびプロシージャ | 説明 |
---|---|
|
|
|
|
|
|
|
|
|
バッファのデータをLOBに書き込み、既存データを上書きします。 |
10.5.10 OCCI: 永続LOBおよびBFILEの値の読取りまたはテストを行うメソッド
表10-16 OCCI: 永続LOBおよびBFILEの値の読取りまたはテストを行うBlob、ClobおよびBfileのメソッド
ファンクションおよびプロシージャ | 説明 |
---|---|
|
読取りおよび書込み用にチャンク・サイズを取得します。これは永続LOBに適用され、外部LOB( |
|
既存および新規に作成されたLOBの設定を取得します。 |
|
LOBまたは |
|
|
|
既存および新規に作成されたLOB設定を使用可能にします。 |
10.5.11 OCCI: BFILE固有の読取り専用メソッド
表10-17 OCCI: BFILE固有の読取り専用メソッド
ファンクションおよびプロシージャ | 説明 |
---|---|
|
オープンしている |
|
|
|
|
|
ディレクトリ・オブジェクト名を取得します。 |
|
|
|
|
10.5.12 OCCI: 他のLOBメソッド
表10-18 他のOCCI LOBメソッド
メソッド | 説明 |
---|---|
|
LOBロケータを別のLOBロケータに割り当てます。=またはコピー・コンストラクタを使用します。 |
|
LOBの文字セット・フォームを戻します。 |
|
LOBの文字セットIDを戻します。 |
|
|
|
2つのLOBが同じLOBを参照しているかどうかを確認します。 |
|
LOBが初期化されているかどうかを確認します。 |
10.6 C/C++(Pro*C)を使用したLOBの作業
埋込みSQLを使用すると、永続LOBの全体、またはLOBの初め、中、終わりの部分を変更できます。読取りを目的として内部LOBと外部LOBの両方にアクセスしたり、永続LOBに対して書込みを行うことができます。
埋込みSQL文によって、BLOB
、CLOB
、NCLOB
およびBFILE
に格納されたデータにアクセスできます。この種の文の詳細は後述します。
関連項目:
構文、ホスト変数、ホスト変数型およびサンプル・コードの詳細は、『Pro*C/C++プログラマーズ・ガイド』を参照してください。
10.6.1 LOBを表す入力ロケータ・ポインタの割当て
PL/SQLのロケータとは異なり、Pro*C/C++のロケータはロケータ・ポインタにマップされ、LOBまたはBFILE値を参照するために使用できます。
埋込みSQL LOB文を正常に実行するには、次の処理が必要です。
10.6.2 Pro*C/C++: BLOB、CLOB、NCLOBおよびBFILEを操作する文
BLOB、CLOBおよびNCLOBを操作するPro*C/C++文は、次のとおりです。
-
永続LOBを変更するには、**INTERNAL XREF ERROR**を参照してください。
-
LOB値の読取りまたは調査を行うには、**INTERNAL XREF ERROR**を参照してください。
-
一時LOBの作成または解放、または一時LOBが存在するかどうかの確認は、**INTERNAL XREF ERROR**を参照してください。
-
BFILEにおけるクローズおよびファイルの有無は、**INTERNAL XREF ERROR**を参照してください。
-
LOBロケータを操作するには、**INTERNAL XREF ERROR**を参照してください。
-
LOBまたは
BFILE
をオープンまたはクローズするには、**INTERNAL XREF ERROR**を参照してください。
10.6.3 Pro*C/C++: 永続LOBの値を変更する埋込みSQL文
表10-20 Pro*C/C++: 永続LOBの値を変更する埋込みSQL文
文 | 説明 |
---|---|
|
LOB |
|
LOBの全体または一部を別のLOBにコピーします。 |
|
指定のオフセットから開始して、LOBの一部を消去します。 |
|
永続LOBの指定されたオフセットに |
|
LOBを切り捨てます。 |
|
LOBの指定されたオフセットにバッファのデータを書き込みます。 |
|
バッファのデータをLOBの終わりに書き込みます。 |
10.6.4 Pro*C/C++: LOBのイントロスペクションに使用する埋込みSQL文
表10-21 Pro*C/C++: LOBのイントロスペクションに使用する埋込みSQL文
文 | 説明 |
---|---|
|
書込み用のチャンク・サイズを取得します。これは、永続LOBに対してのみ機能します。外部LOB ( |
|
LOBまたは |
|
|
10.6.5 Pro*C/C++: 一時LOBを操作する埋込みSQL文
表10-22 Pro*C/C++: 一時LOBを操作する埋込みSQL文
文 | 説明 |
---|---|
|
一時LOBを作成します。 |
|
LOBロケータが一時LOBを参照しているかどうかをチェックします。 |
|
一時LOBを解放します。 |
10.6.6 Pro*C/C++: BFILE固有の埋込みSQL文
表10-23 Pro*C/C++: BFILE固有の埋込みSQL文
文 | 説明 |
---|---|
|
オープンしているすべての |
|
|
|
|
10.6.7 Pro*C/C++: LOBロケータ埋込みSQL文
表10-24 Pro*C/C++: LOBロケータ埋込みSQL文
文 | 説明 |
---|---|
|
LOBロケータを別のLOBロケータに割り当てます。 |
|
|
10.7 COBOL(Pro*COBOL)を使用したLOBの作業
埋込みSQLを使用すると、永続LOBの全体、または永続LOBの初め、中、終わりの部分を変更できます。読取りを目的として内部LOBと外部LOBの両方にアクセスしたり、永続LOBに対して書込みを行うこともできます。
埋込みSQL文によって、BLOB
、CLOB
、NCLOB
およびBFILE
に格納されたデータにアクセスできます。この種の文の詳細は後述します。
10.7.1 LOBを表す入力ロケータ・ポインタの割当て
PL/SQLのロケータとは異なり、Pro*COBOLのロケータはロケータ・ポインタにマップされ、LOBまたはBFILE値を参照するために使用されます。埋込みSQL LOB文を正常に実行するには、次の処理が必要です。
Pro*COBOLインタフェースが必要な機能を提供していない場合は、Cを使用してOCIをコールできます。このようなプログラムはオペレーティング・システムによって異なるため、ここでは例を示しません。
関連項目:
構文、ホスト変数、ホスト変数型およびサンプル・コードの詳細は、『Pro*COBOLプログラマーズ・ガイド』を参照してください。
10.7.2 Pro*COBOL: BLOB、CLOB、NCLOBおよびBFILEを操作する文
BLOB、CLOB、NCLOBおよびBFILEを操作するPro*COBOL文は、次のとおりです。
-
永続LOBを変更するには、**INTERNAL XREF ERROR**を参照してください。
-
内部LOBおよび外部LOBの値の読取りまたはテストは、**INTERNAL XREF ERROR**を参照してください。
-
一時LOBの作成、解放、またはLOBロケータの確認は、**INTERNAL XREF ERROR**を参照してください。
-
BFILE
におけるクローズおよびファイルの有無は、**INTERNAL XREF ERROR**を参照してください。 -
LOBロケータを操作するには、**INTERNAL XREF ERROR**を参照してください。
-
永続LOBまたは
BFILE
をオープンまたはクローズするには、**INTERNAL XREF ERROR**を参照してください。
10.7.3 Pro*COBOL: 永続LOBの値を変更する埋込みSQL文
表10-26 Pro*COBOL: LOBの値を変更する埋込みSQL文
文 | 説明 |
---|---|
|
LOB |
|
LOBの全体または一部を別のLOBにコピーします。 |
|
指定のオフセットから開始して、LOBの一部を消去します。 |
|
永続LOBの指定されたオフセットに |
|
LOBを切り捨てます。 |
|
LOBの指定されたオフセットにバッファのデータを書き込みます。 |
|
バッファのデータをLOBの終わりに書き込みます。 |
10.7.4 Pro*COBOL: LOBのイントロスペクションに使用する埋込みSQL文
表10-27 Pro*COBOL: LOBのイントロスペクションに使用する埋込みSQL文
文 | 説明 |
---|---|
|
書込み用のチャンク・サイズを取得します。 |
|
LOBまたは |
|
|
10.7.5 Pro*COBOL: 一時LOBを操作する埋込みSQL文
表10-28 Pro*COBOL: 一時LOBを操作する埋込みSQL文
文 | 説明 |
---|---|
|
一時LOBを作成します。 |
|
LOBロケータが一時LOBを参照しているかどうかをチェックします。 |
|
一時LOBを解放します。 |
10.7.6 Pro*COBOL: BFILE固有の埋込みSQL文
表10-29 Pro*COBOL: BFILE固有の埋込みSQL文
文 | 説明 |
---|---|
|
オープンしているすべての |
|
|
|
|
10.7.7 Pro*COBOL: LOBロケータ埋込みSQL文
表10-30 Pro*COBOL: LOBロケータ埋込みSQL文
文 | 説明 |
---|---|
|
LOBロケータを別のLOBロケータに割り当てます。 |
|
|
10.8 Java(JDBC)を使用したLOBの作業
Java(JDBC)を使用して、LOBに対して次の作業を行うことができます。
-
一時LOBの作成と操作、および表への永続LOBとしての保存。「JDBC: 一時LOB API」を参照してください。
10.8.1 Javaを使用した内部永続LOBの変更
次のクラスを介して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仕様をサポートします。
10.8.2 Javaを使用した内部永続LOBおよび外部LOB(BFILE)の読取り
JDBCインタフェースでは、Javaを使用して内部永続LOBと外部LOB(BFILE
)の両方を読み取ることができます。
10.8.3 Java(JDBC)からのDBMS_LOBパッケージのコール
これらのクラスによって提供されていないすべてのLOB機能は、PL/SQL
DBMS_LOB
パッケージへコールすることによってアクセスできます。この方法は、このマニュアルの例で繰り返し使用されています。
10.8.4 パフォーマンス改善のための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();
10.8.5 パフォーマンス改善のためのSecureFilesに対するゼロコピー入力/出力
ゼロコピー入力/出力プロトコルを使用すると、SecureFilesのパフォーマンスを改善できます。これは、新しいNet NSデータ転送プロトコルをサポートしているネットワーク・クライアントでのみ使用できます。
LOBがSecureFilesかどうかを判別するには、次のメソッドを使用します。
public boolean isSecureFile() throws SQLException
SecureFilesの場合、TRUE
が戻ります。
このThin接続プロパティを使用すると、ゼロコピー入力/出力プロトコルを無効にできます(FALSE
に設定)。
oracle.net.useZeroCopyIO
10.8.5.1 サーバー上のゼロコピー入力/出力
Oracle Net Servicesでは、ローカル・バッファとの間でデータ転送のやりとりをしなくても、Oracle Net Servicesユーザーにより提供されるデータ・バッファを使用できるようになりました。
ネットワーク・バッファ(NS層)は省略され、内部LOBバッファが直接ネットワークに書き込まれます。バッファの読取りも、同様です。
この機能を使用できるのは、新規NSデータ・パケットをサポートするネットワーク・クライアントのみです(これはNSハンドシェイク中にネゴシエーションされます)。Thinドライバは新規NSプロトコルをサポートしているため、サーバーはゼロコピー・プロトコルを使用できます。また、JavaNetによってゼロコピーIOメカニズムが上位層に公開されるため、Thinドライバ・コードではデータ・コピーは必要なくなります。
10.8.5.2 JDBC Thinドライバでのサーバー上のゼロコピー入力/出力
BLOB.getBytes(long pos, int length, byte[] buffer)
APIをコールすると、指定されたバッファをJavaNet層で使用してバイトがソケットから読み込まれます。
データは1回のラウンドトリップで取得されます。同様に、書込み操作中にBLOB.setBytes(long pos, byte[] bytes)
をコールすると、バッファは直接JavaNet層のネットワーク上に書き込まれます。したがって、データは1回のラウンドトリップで書き込まれます。ユーザー・バッファは、まとめて送信されます。
10.8.6 Java(JDBC)を使用したLOBの参照
次の2つの方法で、前述のすべてのLOBを参照できます。
-
OracleResultSet
の列として -
OraclePreparedStatement
のOUT
型PL/SQLパラメータとして
10.8.6.1 OracleResultSetの使用: 取り出されたBLOBとCLOBオブジェクト
OracleResultSet
の一部としてBLOB
オブジェクトとCLOB
オブジェクトが取り出された場合、これらのオブジェクトは現在選択されている行のLOBロケータを表します。
移動操作(rset
.next
()など)によってカレント行が変更されても、取り出されたロケータは元のLOB行を参照したままです。
最新のカレント行のロケータを取り出すには、移動操作を行うたびに、インスタンスがBLOB
、CLOB
またはBFILE
のいずれであるかに応じて、OracleResultSet
上でgetBLOB()
、getCLOB()
またはgetBFILE()
をコールする必要があります。
10.8.7 JDBC構文の参照および詳細
10.8.8 LOBでの操作のためのJDBCメソッド
BLOB
、CLOB
およびBFILE
を操作するJDBCメソッドは、次のとおりです。
-
BLOB
:-
BLOB
値を変更するには、**INTERNAL XREF ERROR**を参照してください。 -
BLOB
値の読取りまたは調査を行うには、**INTERNAL XREF ERROR**を参照してください。 -
BLOB
データのストリーミングについては、表10-34を参照してください。 -
一時
BLOB
: BLOBの作成、BLOB
がオープンしているかどうかの確認および一時BLOBの解放について。**INTERNAL XREF ERROR**を参照してください。 -
BLOBのオープン、クローズ、および
BLOB
が開いているかどうかの確認は、**INTERNAL XREF ERROR**を参照してください。 -
BLOB
の切捨てについては、**INTERNAL XREF ERROR**を参照してください。 -
BLOB
のストリーミングAPIについては、**INTERNAL XREF ERROR**を参照してください。
-
-
CLOB
:-
CLOB
値の読取りまたは調査を行うには、**INTERNAL XREF ERROR**を参照してください。 -
CLOB
データのストリーミングについては、表10-37を参照してください。 -
CLOB
を変更するには、**INTERNAL XREF ERROR**を参照してください。
-
-
一時
CLOB
:-
CLOBのオープン、クローズ、および
CLOB
が開いているかどうかの確認は、**INTERNAL XREF ERROR**を参照してください。 -
CLOB
の切捨てについては、**INTERNAL XREF ERROR**を参照してください。 -
CLOB
のストリーミングAPIについては、**INTERNAL XREF ERROR**を参照してください。
-
-
BFILE
:-
BFILE
の読取りまたは調査については、**INTERNAL XREF ERROR**を参照してください。 -
BFILE
データのストリーミングについては、表10-39を参照してください。 -
BFILEのオープン、クローズ、および
BFILE
が開いているかどうかの確認は、**INTERNAL XREF ERROR**を参照してください。 -
BFILEのストリーミングAPIについては、**INTERNAL XREF ERROR**を参照してください。
-
10.8.9 JDBC: BLOB値を変更するoracle.sql.BLOBメソッド
表10-32 JDBC: BLOB値を変更するoracle.sql.BLOBメソッド
メソッド | 説明 |
---|---|
|
指定されたオフセットから、バイト配列を |
10.8.10 JDBC: BLOB値の読取りまたはテストを行うoracle.sql.BLOBメソッド
表10-33 JDBC: BLOB値の読取りまたはテストを行うoracle.sql.BLOBメソッド
メソッド | 説明 |
---|---|
|
指定されたオフセットから、バイトの配列としてLOBの内容を取得します。 |
|
LOB内の指定されたバイト配列を、指定されたオフセットで検索します。 |
|
指定された |
|
このLOBを別のLOBと比較します。LOBロケータを相互に比較します。 |
|
LOBの長さを戻します。 |
|
LOBのチャンク・サイズを戻します。 |
10.8.11 JDBC: BLOBデータのストリーミングのためのoracle.sql.BLOBメソッドおよびプロパティ
表10-34 JDBC: BLOBデータのストリーミングのためのoracle.sql.BLOBメソッドおよびプロパティ
メソッド | 説明 |
---|---|
|
LOBをバイナリ・ストリームとして流すストリームを戻します。 |
|
この |
10.8.12 JDBC: CLOB値を変更するoracle.sql.CLOBメソッド
表10-35 JDBC: CLOB値を変更するoracle.sql.CLOBメソッド
メソッド | 説明 |
---|---|
|
JDBC 3.0: この |
|
指定されたオフセットから、文字配列をLOBに挿入します。 |
10.8.13 JDBC: CLOB値の読取りまたはテストを行うoracle.sql.CLOBメソッド
表10-36 JDBC: CLOB値の読取りまたはテストを行うoracle.sql.CLOBメソッド
メソッド | 説明 |
---|---|
|
LOBの部分文字列を文字列として戻します。 |
|
LOBのサブセットを文字配列に読み取ります。 |
|
指定された文字列をLOB内の指定されたオフセットから検索します。 |
|
指定された |
|
LOBの長さを戻します。 |
|
|
10.8.14 JDBC: CLOBデータのストリーミングのためのoracle.sql.CLOBメソッドおよびプロパティ
表10-37 JDBC: CLOBデータのストリーミングのためのoracle.sql.CLOBメソッドおよびプロパティ
メソッド | 説明 |
---|---|
|
|
|
JDBC 3.0: この |
|
|
|
JDBC 3.0: この |
10.8.15 JDBC: 外部LOB(BFILE)値の読取りまたはテストを行うoracle.sql.BFILEメソッド
表10-38 JDBC: 外部LOB(BFILE)値の読取りまたはテストを行うoracle.sql.BFILEメソッド
メソッド | 説明 |
---|---|
|
|
|
|
|
指定されたオフセットから、LOB内の指定された |
|
指定されたオフセットから、 |
|
|
|
この |
|
この |
|
この |
|
|
|
この |
|
この |
10.8.16 JDBC: BFILEデータのストリーミングのためのoracle.sql.BFILEメソッドおよびプロパティ
表10-39 JDBC: BFILEデータのストリーミングのためのoracle.sql.BFILEメソッドおよびプロパティ
メソッド | 説明 |
---|---|
|
|
10.8.17 JDBC: 一時LOB API
Oracle Database JDBCドライバには、一時LOBを作成およびクローズするためのAPIが含まれます。これらのAPIによって、以前のリリースで使用していたDBMS_LOB
PL/SQLパッケージの次のプロシージャを使用する必要がなくなります。
-
DBMS_LOB.createTemporary()
-
DBMS_LOB.isTemporary()
-
DBMS_LOB.freeTemporary()
表10-40 JDBC: 一時BLOB API
メソッド | 説明 |
---|---|
|
一時 |
|
指定の |
|
現行の |
|
指定の一時 |
|
一時 |
表10-41 JDBC: 一時CLOB API
メソッド | 説明 |
---|---|
|
一時 |
|
指定の |
|
現行の |
|
指定の一時 |
|
一時 |
10.8.18 JDBC: LOBのオープンおよびクローズ
oracle.sql.CLOB
クラスは、標準JDBCのjava.sql.Clob
インタフェースをOracle JDBCドライバに実装したものです。表10-41は、oracle.sql.CLOB
で一時CLOBにアクセスするためのOracle拡張APIを示しています。
Oracle DatabaseのJDBCドライバには、明示的にLOBをオープンおよびクローズするためのAPIが含まれます。これらのAPIによって、以前のDBMS_LOB.open()
およびDBMS_LOB.close()
を使用する必要がなくなります。
10.8.19 JDBC: BLOBのオープンおよびクローズ
oracle.sql.BLOB
クラスは、標準JDBCのjava.sql.BlobインタフェースをOracle JDBCドライバに実装したものです。表10-42は、oracle.sql.BLOB
でBLOBをオープンおよびクローズするためのOracle拡張APIを示しています。
表10-42 JDBC: BLOBのオープンおよびクローズ
メソッド | 説明 |
---|---|
|
|
|
|
|
|
10.8.19.1 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);
10.8.19.2 JDBCを使用した、BLOBがオープンしているかどうかの確認
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 ();
10.8.20 JDBC: CLOBのオープンおよびクローズ
oracle.sql.CLOB
クラスは、標準JDBCのjava.sql.Clob
インタフェースをOracle JDBCドライバに実装したものです。表10-43は、oracle.sql.CLOB
でCLOB
をオープンおよびクローズするためのOracle拡張APIを示しています。
表10-43 JDBC: CLOBのオープンおよびクローズ
メソッド | 説明 |
---|---|
|
|
|
|
|
|
10.8.20.1 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);
10.8.20.2 JDBCを使用した、CLOBがオープンしているかどうかの確認
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 ();
10.8.21 JDBC: BFILEのオープンおよびクローズ
oracle.sql.BFILE
クラスは、データベースBFILE
オブジェクトをラップします。表10-44は、oracle.sql.BFILE
でBFILE
をオープンおよびクローズするOracle拡張APIを示しています。
表10-44 BFILEをオープンおよびクローズするためのJDBC拡張API
メソッド | 説明 |
---|---|
|
|
|
|
|
|
|
|
10.8.21.1 BFILEのオープン
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 ();
10.8.21.2 BFILEがオープンしているかどうかの確認
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 ();
10.8.21.3 BFILEのクローズ
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 ();
10.8.21.4 使用例(OpenCloseLob.java)
/*
* 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 ();
}
}
10.8.22 JDBCを使用したLOBの切捨て
Oracle DatabaseのJDBCドライバには、永続LOBを切り捨てるためのAPIが含まれています。これによって、以前のDBMS_LOB.trim()
を使用する必要がなくなります。
10.8.22.1 JDBC: BLOBの切捨て
oracle.sql.BLOB
クラスは、標準JDBCのjava.sql.Blob
インタフェースをOracle JDBCドライバに実装したものです。表10-45は、oracle.sql.BLOB
でBLOBを切り捨てるためのOracle拡張APIを示しています。
表10-45 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
の新しい長さを指定します。
10.8.22.2 JDBC: CLOBの切捨て
oracle.sql.CLOB
クラスは、標準JDBCのjava.sql.Clob
インタフェースをOracle JDBCドライバに実装したものです。表10-46は、oracle.sql.CLOB
でCLOB
を切り捨てるためのOracle拡張APIを示しています。
表10-46 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データの切捨てについて」を参照してください。
10.8.23 JDBC BLOBストリーミングAPI
データベースに用意されているJDBCインタフェースには、要求された位置でJavaストリームからのLOBの読取りおよび書込みを行うためのLOBストリーミングAPIが含まれています。
oracle.sql.BLOB
クラスは、標準JDBCのjava.sql.Blob
インタフェースを実装したものです。表10-47は、BLOBストリーミングAPIを示しています。
表10-47 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
10.8.24 JDBC CLOBストリーミングAPI
oracle.sql.CLOB
クラスは、標準JDBCのjava.sql.Clob
インタフェースをOracle JDBCドライバに実装したものです。表10-48は、CLOB
ストリーミングAPIを示しています。
表10-48 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
10.8.25 BFILEストリーミングAPI
oracle.sql.BFILE
クラスは、データベースBFILE
をラップします。表10-49は、oracle.sql.BFILE
でBFILE
の内容を、要求された位置から読み取るOracle拡張APIを示しています。
表10-49 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
10.8.25.1 JDBC BFILEストリーミングの例(NewStreamLob.java)
/*
* 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();
}
}
10.8.26 JDBCおよび空のLOB
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に対する操作は無効です」が表示されます。
10.9 Oracle Provider for OLE DB(OraOLEDB)
OraOLEDBは、OLE DBおよびADOの開発者に高いパフォーマンス、およびOracleデータへの効率的なアクセスを提供します。
COM、C++または任意のCOMクライアントを使用してプログラムを作成する開発者は、OraOLEDBを使用してOracleデータベースにアクセスできます。
OraOLEDBは、OracleのためのOLE DBプロバイダです。これは、高いパフォーマンス、およびLOBなどのOracleデータへの効率的なアクセスを提供します。また、これを使用して特定のLOB型に更新することもできます。
OraOLEDBは、次のLOB型をサポートします。
-
永続LOBの場合:
行セット全体での
READ
/WRITE
。 -
BFILEの場合:
行セット全体での読取り専用。
-
一時LOB:
行セット全体ではサポートされません。
10.10 Oracle Data Provider for .NET(ODP.NET)の概要
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を使用することを開発者に薦めています。