10 LOB APIの概要

LOBをサポートするために複数のAPIが用意されています。

内容は次のとおりです。

10.1 LOBをサポートするプログラム環境

表10-1に、LOB機能をサポートするプログラム環境を示します。

関連項目:

サポートされているLOB操作用のAPIについては、次の章を参照してください。

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

DBMS_LOB.COMPARE

該当なし

該当なし

該当なし

DBMS_LOB.INSTR

該当なし

該当なし

該当なし

DBMS_LOB.SUBSTR

該当なし

該当なし

該当なし

DBMS_LOB.APPEND

OCILobAppend()

Blob.append()

APPEND

利用不可(PL/SQL割当て演算子を使用)

OCILobAssign()

 

ASSIGN

該当なし

OCILobCharSetForm()

Clob.getCharsetForm (CLOBのみ)

該当なし

該当なし

OCILobCharSetId()

Clob.getCharsetId()

(CLOBのみ)

該当なし

DBMS_LOB.CLOSE

OCILobClose()

Blob.close()

CLOSE

該当なし

該当なし

Clob.closeStream()

該当なし

DBMS_LOB.COPY

OCILobCopy2()

Blob.copy()

COPY

該当なし

OCILobDisableBuffering()

該当なし

DISABLE BUFFERING

該当なし

OCILobEnableBuffering()

該当なし

ENABLE BUFFERING

DBMS_LOB.ERASE

OCILobErase2()

該当なし

ERASE

DBMS_LOB.FILECLOSE

OCILobFileClose()

Clob.close()

CLOSE

DBMS_LOB.FILECLOSEALL

OCILobFileCloseAll()

該当なし

FILE CLOSE ALL

DBMS_LOB.FILEEXISTS

OCILobFileExist()

Bfile.fileExists()

DESCRIBE [FILEEXISTS]

DBMS_LOB.GETCHUNKSIZE

OCILobGetChunkSize()

Blob.getChunkSize()

DESCRIBE [CHUNKSIZE]

DBMS_LOB.GET_STORAGE_LIMIT

OCILobGetStorageLimit()

該当なし

該当なし

DBMS_LOB.GETOPTIONS

OCILobGetOptions()

Blob/Clob::getOptions

該当なし

DBMS_LOB.FILEGETNAME

OCILobFileGetName()

Bfile.getFileName()およびBfile.getDirAlias()

DESCRIBE DIRECTORYFILENAME

DBMS_LOB.FILEISOPEN

OCILobFileIsOpen()

Bfile.isOpen()

DESCRIBE ISOPEN

DBMS_LOB.FILEOPEN

OCILobFileOpen()

Bfile.open()

OPEN

該当なし(BFILENAME演算子を使用)

OCILobFileSetName()

Bfile.setName()

FILE SET

該当なし

OCILobFlushBuffer()

該当なし

FLUSH BUFFER

DBMS_LOB.GETLENGTH

OCILobGetLength2()

Blob.length()

DESCRIBE LENGTH

該当なし

OCILobIsEqual()

演算子= ( )=/!=を使用

該当なし

DBMS_LOB.ISOPEN

OCILobIsOpen()

Blob.isOpen()

DESCRIBE ISOPEN

DBMS_LOB.LOADFROMFILE

OCILobLoadFromFile2()

overloadedcopy()を使用

LOAD FROM FILE

該当なし

OCILobLocatorIsInit()

Clob.isinitialized()

該当なし

DBMS_LOB.OPEN

OCILobOpen()

Blob.open

OPEN

DBMS_LOB.READ

OCILobRead()

Blob.read

READ

DBMS_LOB.SETOPTIONS

OCILobSetOptions()

Blob/Clob::setOptions

該当なし

DBMS_LOB.TRIM

OCILobTrim2()

Blob.trim

TRIM

DBMS_LOB.WRITE

OCILobWrite2

Blob.write

WRITEORALOB.

DBMS_LOB.WRITEAPPEND

OCILobWriteAppend2()

該当なし

WRITE APPEND

DBMS_LOB.CREATETEMPORARY

OCILobCreateTemporary()

該当なし

該当なし

DBMS_LOB.FREETEMPORARY

OCILobFreeTemporary()

該当なし

該当なし

DBMS_LOB.ISTEMPORARY

OCILobIsTemporary()

該当なし

該当なし

該当なし

OCILobLocatorAssign()

演算子= ( )またはコピー・コンストラクタを使用

該当なし

表10-3 LOBインタフェースの比較(2/2)

PL/SQL:DBMS_LOB(dbmslob.sql) Java (JDBC) ODP.NET

DBMS_LOB.COMPARE

DBMS_LOBを使用。

OracleClob.Compare

DBMS_LOB.INSTR

position

OracleClob.Search

DBMS_LOB.SUBSTR

BLOBまたはBFILE固有のgetBytesCLOB固有のgetSubString

該当なし

DBMS_LOB.APPEND

lengthの後でputBytes()またはPutString()を使用

OracleClob.Append

OCILobAssign()

利用不可(等号を使用)

OracleClob.Clone

OCILobCharSetForm()

該当なし

該当なし

OCILobCharSetId()

該当なし

該当なし

DBMS_LOB.CLOSE

DBMS_LOBを使用。

OracleClob.Close

DBMS_LOB.COPY

readおよびwriteを使用

OracleClob.CopyTo

OCILobDisableBuffering()

該当なし

該当なし

OCILobEnableBuffering()

該当なし

該当なし

DBMS_LOB.ERASE

DBMS_LOBを使用。

OracleClob.Erase

DBMS_LOB.FILECLOSE

closeFile

OracleBFile.CloseFile

DBMS_LOB.FILECLOSEALL

DBMS_LOBを使用。

該当なし

DBMS_LOB.FILEEXISTS

fileExists

OracleBFile.FileExists

DBMS_LOB.GETCHUNKSIZE

getChunkSize

OracleClob.OptimumChunkSize

DBMS_LOB.FILEGETNAME

getDirAlias

getName

OracleBFile.DirectoryNameOracle.BFile.FileName

DBMS_LOB.FILEISOPEN

Use DBMS_LOB.ISOPEN

OracleBFile.IsOpen

DBMS_LOB.FILEOPEN

openFile

OracleBFile.OpenFile

OCILobFileSetName()

BFILENAMEを使用

OracleBFile.DirectoryName

Oracle.BFile.FileName

OCILobFlushBuffer()

該当なし

該当なし

DBMS_LOB.GETLENGTH

length

OracleClob.Length

該当なし

equals()

該当なし

DBMS_LOB.ISOPEN

DBMS_LOB.ISOPEN()を使用

OracleClob.IsInChunkWriteMode

DBMS_LOB.LOADFROMFILE

readの後でwriteを使用

該当なし

DBMS_LOB.OPEN

DBMS_LOB.OPEN()を使用

OracleClob.BeginChunkWrite

DBMS_LOB.READ

BLOBまたはBFILE: getBytes()およびgetBinaryStream()

CLOB: getString()getSubString()およびgetCharacterStream()

OracleClob.Read

DBMS_LOB.TRIM

DBMS_LOB.TRIM()を使用

OracleClob.SetLength

DBMS_LOB.WRITE

BLOB: setBytes()およびsetBinaryStream()

CLOB: setString()およびsetCharacterStream()

OracleClob.Write

DBMS_LOB.WRITEAPPEND

length()の後でputString()またはputBytes()を使用

OracleClob.Append

DBMS_LOB.CREATETEMPORARY

該当なし

OracleClobコンストラクタ

DBMS_LOB.FREETEMPORARY

該当なし

OracleClob.Dispose

DBMS_LOB.ISTEMPORARY

該当なし

OracleClob.IsTemporary

10.3 PL/SQL(DBMS_LOBパッケージ)を使用したLOBの作業

PL/SQL DBMS_LOBパッケージは、次の操作のために使用できます。

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データ型に対する操作に適用されます。

  • 次のプロシージャを使用する場合のガイドライン

    • DBMS_LOB.LOADFROMFILE

    • DBMS_LOB.LOADBLOBFROMFILE

    • DBMS_LOB.LOADCLOBFROMFILE

    量パラメータには、ロード元の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を入力として受け取ります。

関連項目:

10.3.4 LOB用のPL/SQLファンクションおよびプロシージャ

関連項目:

BLOBCLOBNCLOBおよびBFILEを操作するPL/SQLファンクションおよびプロシージャの概要は、次のとおりです

10.3.5 LOB値を変更するPL/SQLファンクションおよびプロシージャ

次の表に、DBMS_LOBプロシージャを示します。

表10-4 PL/SQL: LOB値を変更するDBMS_LOBプロシージャ

ファンクションおよびプロシージャ 説明

APPEND

LOB値を別のLOBに追加します。

CONVERTTOBLOB

CLOBBLOBに変換します。

CONVERTTOCLOB

BLOBCLOBに変換します。

COPY

LOBの全体または一部を他のLOBにコピーします。

ERASE

指定のオフセットから開始して、LOBの一部を消去します。

FRAGMENT_DELETE

LOBの指定されたオフセットから指定された長さのデータを削除します。

FRAGMENT_INSERT

LOBの指定されたオフセットに、指定されたデータ(32KB未満)を挿入します。

FRAGMENT_MOVE

指定されたオフセットから他の指定されたオフセットに、指定されたバイト数を移動します。

FRAGMENT_REPLACE

指定されたオフセットのデータを、指定されたデータ(32KB未満)と置換します。

LOADFROMFILE

BFILEデータを永続LOBにロードします。

LOADCLOBFROMFILE

文字セットをファイルからLOBにロードします。

LOADBLOBFROMFILE

バイナリ・データをファイルからLOBにロードします。

SETOPTIONS

LOB機能(重複除外および圧縮)を設定します。

TRIM

指定された長さまでLOB値を切り捨てます。

WRITE

指定されたオフセットからLOBにデータを書き込みます。

WRITEAPPEND

データをLOBの終わりに書き込みます。

10.3.6 LOBのイントロスペクションに使用するPL/SQLファンクションおよびプロシージャ

表10-5 PL/SQL: 内部LOBおよび外部LOBの値の読取りまたはテストを行うDBMS_LOBプロシージャ

ファンクションおよびプロシージャ 説明

COMPARE

2つのLOBの値を比較します。

GETCHUNKSIZE

読取りおよび書込み用にチャンク・サイズを取得します。これは永続LOBにのみ適用され、外部LOB(BFILE)には適用されません。

GETLENGTH

LOB値の長さを取得します。

GETOPTIONS

SecureFilesのオプション(重複除外、圧縮、暗号化)を戻します。

GET_STORAGE_LIMIT

データベース構成のLOB記憶域制限を取得します。

INSTR

LOBにおけるパターンのn番目の出現位置を戻します。

ISSECUREFILE

このファンクションは、渡されるBLOBまたはCLOBロケータがSecureFiles用の場合はTRUE、そうでない場合はFALSEを戻します。

READ

指定されたオフセットからLOBのデータを読み取ります。

SETOPTIONS

デフォルトのLOB列の設定を上書きする、SecureFilesのオプション(重複除外および圧縮)を設定します。サーバーへのラウンドトリップが発生します。

SUBSTR

指定されたオフセットから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読取り専用プロシージャ

ファンクションおよびプロシージャ 説明

FILECLOSE

ファイルをクローズします。CLOSE()でも可能です。

FILECLOSEALL

オープンしていたすべてのファイルをクローズします。

FILEEXISTS

ファイルがサーバー上に存在するかどうかを確認します。

FILEGETNAME

ディレクトリ・オブジェクト名とファイル名を取得します。

FILEISOPEN

入力BFILEロケータを使用して、ファイルがオープンされたかどうかを確認します。ISOPEN()でも可能です。

FILEOPEN

ファイルをオープンします。OPEN()でも可能です。

10.3.9 PL/SQL: 内部LOBおよび外部LOBをオープンおよびクローズするファンクションおよびプロシージャ

表10-8 PL/SQL: 内部LOBおよび外部LOBをオープンおよびクローズするDBMS_LOBプロシージャ

ファンクションおよびプロシージャ 説明

OPEN

LOBをオープンします

ISOPEN

LOBがオープンしているかどうかを確認します。

CLOSE

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より優先されます。

関連項目:

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.3.2 OCIにおけるNCLOBの使用

NCLOBは、メソッドのパラメータとして使用できます。

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.7 OCIにおける定義変数とアウトバインド変数内のLOBロケータ

SQL文の定義変数またはアウトバインド変数内でLOBロケータを再利用する前に、OCIFreeTemporary()を使用して既存のLOBロケータ・バッファ内の一時LOBを解放する必要があります。

10.4.8 OCI: BLOB、CLOB、NCLOBおよびBFILEを操作する関数

BLOBCLOBNCLOBおよびBFILEを操作するOCI関数は、次のとおりです。

  • 永続LOBを変更するには、表10-9を参照してください。

  • LOB値の読取りまたはテストは、表10-10を参照してください。

  • 一時LOBの作成または解放、または一時LOBが存在するかどうかの確認は、表10-11を参照してください。

  • 外部LOB(BFILE)での読取り専用ファンクションは、表10-12を参照してください。

  • LOBロケータでの操作は、表10-13を参照してください。

  • LOBのバッファリングは、表10-14を参照してください。

  • LOBのオープンおよびクローズは、表10-15を参照してください。

10.4.9 OCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更する関数

表10-9 OCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更する関数

ファンクションおよびプロシージャ 説明

OCILobAppend()

LOB値を別のLOBに追加します。

OCILobArrayWrite()

1回のラウンドトリップで複数のロケータを使用してデータを書き込みます。

OCILobCopy2()

LOBの全体または一部を他のLOBにコピーします。

OCILobErase2()

指定のオフセットから開始して、LOBの一部を消去します。

OCILobLoadFromFile2()

BFILEデータを永続LOBにロードします。

OCILobSetContentType()

SecureFilesにコンテンツ文字列を設定します。

OCILObSetOptions()

SecureFilesのオプション設定(重複除外および圧縮)を使用可能にします。

OCILobTrim2()

LOBを切り捨てます。

OCILobWrite2()

バッファのデータをLOBに書き込み、既存データを上書きします。

OCILobWriteAppend2()

バッファのデータをLOBの終わりに書き込みます。

10.4.10 OCI: 永続LOBおよび外部LOB(BFILE)の値の読取りまたはテストを行う関数

表10-10 OCI: 永続LOBおよび外部LOB(BFILE)の値の読取りまたはテストを行う関数

ファンクションおよびプロシージャ 説明

OCILobArrayRead()

1回のラウンドトリップで複数のロケータを使用してデータを読み取ります。

OCILobGetChunkSize()

読取りおよび書込み用にチャンク・サイズを取得します。これは永続LOBに適用され、外部LOB(BFILE)には適用されません。

OCILobGetContentType()

SecureFilesのコンテンツ文字列を取得します。

OCILobGetLength2()

LOBまたはBFILEの長さを戻します。

OCILObGetOptions()

指定されたSecureFilesの使用可能な設定(重複除外、圧縮および暗号化)を取得します。

OCILobGetStorageLimit()

内部LOBの最大長を取得します。

OCILobRead2()

NULL以外のLOBまたはBFILEの指定部分をバッファに読み取ります。

10.4.11 OCI: 一時LOBを操作する関数

表10-11 OCI: 一時LOBを操作する関数

ファンクションおよびプロシージャ 説明

OCILobCreateTemporary()

一時LOBを作成します。

OCILobIsTemporary()

一時LOBが存在するかどうかを確認します。

OCILobFreeTemporary()

一時LOBを解放します。

10.4.12 OCI: BFILE固有の読取り専用関数

表10-12 OCI: BFILE固有の読取り専用関数

ファンクションおよびプロシージャ 説明

OCILobFileClose()

オープンしているBFILEをクローズします。

OCILobFileCloseAll()

オープンしているすべてのBFILEをクローズします。

OCILobFileExists()

BFILEが存在するかどうかを確認します。

OCILobFileGetName()

BFILEの名前を戻します。

OCILobFileIsOpen()

BFILEがオープンしているかどうかを確認します。

OCILobFileOpen()

BFILEをオープンします。

10.4.13 OCI: LOBロケータ関数

表10-13 OCI: LOBロケータ関数

ファンクションおよびプロシージャ 説明

OCILobAssign()

LOBロケータを別のLOBロケータに割り当てます。

OCILobCharSetForm()

LOBの文字セット・フォームを戻します。

OCILobCharSetId()

LOBの文字セットIDを戻します。

OCILobFileSetName()

BFILEの名前をロケータに設定します。

OCILobIsEqual()

2つのLOBロケータが同じLOBを参照しているかどうかを確認します。

OCILobLocatorIsInit()

LOBロケータが初期化されているかどうかを確認します。

10.4.14 OCI LOBバッファリング関数

表10-14 OCI: LOBバッファリング関数

ファンクションおよびプロシージャ 説明

OCILobDisableBuffering()

バッファリング・サブシステムを使用禁止にします。

OCILobEnableBuffering()

後続のLOBデータの読取り/書込みに、LOBバッファリング・サブシステムを使用します。

OCILobFlushBuffer()

LOBバッファリング・サブシステムへの変更を、データベース(サーバー)へフラッシュします。

10.4.15 OCI: 内部LOBおよび外部LOBをオープンおよびクローズする関数

表10-15 OCI: 内部LOBおよび外部LOBをオープンおよびクローズする関数

ファンクションおよびプロシージャ 説明

OCILobOpen()

LOBをオープンします。

OCILobIsOpen()

LOBがオープンしているかどうかを確認します。

OCILobClose()

LOBをクローズします。

10.4.16 OCI LOBの例

OCIの例は、次の章にも記載されています。

関連項目:

OCIのデモ・スクリプト・リストの詳細は、Oracle Call Interfaceプログラマーズ・ガイドを参照してください

10.4.17 OCIの詳細

関連項目:

OCI機能の詳細とよくある質問については、http://www.oracle.com/technology/を参照してください。

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の一部の抽出を実行するためのメソッドが提供されます。

関連項目:

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.4.1 OCCIにおけるNCLOBの使用
  • NCLOBインスタンスは、メソッドのパラメータとして使用できます。

  • NCLOBインスタンスを、オブジェクト型の属性として使用できるようになりました。

10.5.5 OCCI LOB copy()メソッドの量パラメータ

ClobおよびBlobcopy()メソッドを使用すると、BFILEからデータをロードできます。このメソッドの量パラメータには、次のいずれかの値を渡すことができます。

  • データの一部をロードする場合は、BFILEのサイズよりも小さい量。

  • データ全体をロードする場合は、BFILEのサイズと等しい量。

  • BFILEデータをすべてロードする場合は、UB8MAXVAL定数

BFILEのサイズより大きいサイズは指定できません。

10.5.6 OCCI read()操作の量パラメータ

ClobBlobまたはBfileオブジェクトに対するread()メソッドは、BFILEからデータを読み取ります。量パラメータの次のいずれかの値を渡して、読み取るデータ量を指定できます。

  • データの一部をロードする場合は、BFILEのサイズよりも小さい量。

  • データ全体をロードする場合は、BFILEのサイズと等しい量。

  • BFILEの終わりまでストリーム・モードで読み取る場合は、0 (ゼロ)

BFILEのサイズより大きいサイズは指定できません。

10.5.7 OCCIの詳細

関連項目:

10.5.8 OCCI: BLOB、CLOB、NCLOBおよびBFILEを操作するメソッド

BLOBCLOBNCLOBおよびBFILEを操作するOCCIメソッドは、次のとおりです。

  • 永続LOBを変更するには、表10-16を参照してください。

  • LOB値の読取りまたはテストは、表10-17を参照してください。

  • 外部LOB(BFILE)での読取り専用メソッドは、表10-18を参照してください。

  • 他のLOB OCCIメソッドは、表10-19を参照してください。

  • LOBのオープンおよびクローズは、表10-20を参照してください。

10.5.9 OCCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更するメソッド

表10-16 OCCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更するClobメソッドおよびBlobメソッド

ファンクションおよびプロシージャ 説明

Blob/Clob.append()

CLOBまたはBLOB値を別のLOBに追加します。

Blob/Clob.copy()

CLOBまたはBLOBの全体または一部を別のLOBにコピーします。

Blob/Clob.copy()

BFILEデータを永続LOBにロードします。

Blob/Clob.trim()

CLOBまたはBLOBを切り捨てます。

Blob/Clob.write()

バッファのデータをLOBに書き込み、既存データを上書きします。

10.5.10 OCCI: 永続LOBおよびBFILEの値の読取りまたはテストを行うメソッド

表10-17 OCCI: 永続LOBおよびBFILEの値の読取りまたはテストを行うBlob、ClobおよびBfileのメソッド

ファンクションおよびプロシージャ 説明

Blob/Clob.getChunkSize()

読取りおよび書込み用にチャンク・サイズを取得します。これは永続LOBに適用され、外部LOB(BFILE)には適用されません。

Blob/Clob.getOptions()

既存および新規に作成されたLOBの設定を取得します。

Blob/Clob.length()

LOBまたはBFILEの長さを戻します。

Blob/Clob.read()

NULL以外のLOBまたはBFILEの指定部分をバッファに読み取ります。

Blob/Clob.setOptions()

既存および新規に作成されたLOB設定を使用可能にします。

10.5.11 OCCI: BFILE固有の読取り専用メソッド

表10-18 OCCI: BFILE固有の読取り専用メソッド

ファンクションおよびプロシージャ 説明

Bfile.close()

オープンしているBFILEをクローズします。

Bfile.fileExists()

BFILEが存在するかどうかを確認します。

Bfile.getFileName()

BFILEの名前を戻します。

Bfile.getDirAlias()

ディレクトリ・オブジェクト名を取得します。

Bfile.isOpen()

BFILEがオープンしているかどうかを確認します。

Bfile.open()

BFILEをオープンします。

10.5.12 OCCI: 他のLOBメソッド

表10-19 他のOCCI LOBメソッド

メソッド 説明

Clob/Blob/Bfile.operator=()

LOBロケータを別のLOBロケータに割り当てます。=またはコピー・コンストラクタを使用します。

Clob.getCharSetForm()

LOBの文字セット・フォームを戻します。

Clob.getCharSetId()

LOBの文字セットIDを戻します。

Bfile.setName()

BFILEの名前を設定します。

Clob/Blob/Bfile.operator==()

2つのLOBが同じLOBを参照しているかどうかを確認します。

Clob/Blob/Bfile.isInitialized()

LOBが初期化されているかどうかを確認します。

10.5.13 OCCI: 内部LOBおよび外部LOBをオープンおよびクローズするメソッド

表10-20 OCCI: 内部LOBおよび外部LOBをオープンおよびクローズするメソッド

ファンクションおよびプロシージャ 説明

Clob/Blob/Bfile.Open()

LOBをオープンします

Clob/Blob/Bfile.isOpen()

LOBがオープンしているかどうかを確認します。

Clob/Blob/Bfile.Close()

LOBをクローズします

10.6 C/C++(Pro*C)を使用したLOBの作業

埋込みSQLを使用すると、永続LOBの全体、またはLOBの初め、中、終わりの部分を変更できます。読取りを目的として内部LOBと外部LOBの両方にアクセスしたり、永続LOBに対して書込みを行うことができます。

埋込みSQL文によって、BLOBCLOBNCLOBおよびBFILEに格納されたデータにアクセスできます。この種の文の詳細は後述します。

関連項目:

構文、ホスト変数、ホスト変数型およびサンプル・コードの詳細は、『Pro*C/C++プログラマーズ・ガイド』を参照してください。

10.6.1 LOBを表す入力ロケータ・ポインタの割当て

PL/SQLのロケータとは異なり、Pro*C/C++のロケータはロケータ・ポインタにマップされ、LOBまたはBFILE値を参照するために使用できます。

埋込みSQL LOB文を正常に実行するには、次の処理が必要です。

  1. 文を実行する前に、データベース表領域または外部ファイルシステムに存在するLOBを表す入力ロケータ・ポインタを割り当てます。
  2. LOBロケータをLOBロケータ・ポインタ変数にSELECTします。
  3. 埋込みSQL LOB文の中でこの変数を使用し、LOB値にアクセスし操作します。

    関連項目:

    サポートされているLOB操作用のAPIについては、次の章を参照してください。

10.6.2 Pro*C/C++: BLOB、CLOB、NCLOBおよびBFILEを操作する文

BLOB、CLOBおよびNCLOBを操作するPro*C/C++文は、次のとおりです。

  • 永続LOBを変更するには、表10-21を参照してください。

  • LOB値の読取りまたはテストは、表10-22を参照してください。

  • 一時LOBの作成または解放、または一時LOBが存在するかどうかの確認は、表10-23を参照してください。

  • BFILEにおけるクローズおよびファイルの有無は、表10-24を参照してください。

  • LOBロケータでの操作は、表10-25を参照してください。

  • LOBのバッファリングは、表10-26を参照してください。

  • LOBまたはBFILEのオープンまたはクローズは、表10-27を参照してください。

10.6.3 Pro*C/C++: 永続LOBの値を変更する埋込みSQL文

表10-21 Pro*C/C++: 永続LOBの値を変更する埋込みSQL文

説明

APPEND

LOB値を別のLOBに追加します。

COPY

LOBの全体または一部を別のLOBにコピーします。

ERASE

指定のオフセットから開始して、LOBの一部を消去します。

LOAD FROM FILE

永続LOBの指定されたオフセットにBFILEデータをロードします。

TRIM

LOBを切り捨てます。

WRITE

LOBの指定されたオフセットにバッファのデータを書き込みます。

WRITE APPEND

バッファのデータをLOBの終わりに書き込みます。

10.6.4 Pro*C/C++: LOBのイントロスペクションに使用する埋込みSQL文

表10-22 Pro*C/C++: LOBのイントロスペクションに使用する埋込みSQL文

説明

DESCRIBE [CHUNKSIZE]

書込み用のチャンク・サイズを取得します。これは、永続LOBに対してのみ機能します。外部LOB (BFILE)には適用されません。

DESCRIBE [LENGTH]

LOBまたはBFILEの長さを戻します。

READ

NULL以外のLOBまたはBFILEの指定部分をバッファに読み取ります。

10.6.5 Pro*C/C++: 一時LOBを操作する埋込みSQL文

表10-23 Pro*C/C++: 一時LOBを操作する埋込みSQL文

説明

CREATE TEMPORARY

一時LOBを作成します。

DESCRIBE [ISTEMPORARY]

LOBロケータが一時LOBを参照しているかどうかをチェックします。

FREE TEMPORARY

一時LOBを解放します。

10.6.6 Pro*C/C++: BFILE固有の埋込みSQL文

表10-24 Pro*C/C++: BFILE固有の埋込みSQL文

説明

FILE CLOSE ALL

オープンしているすべてのBFILEをクローズします。

DESCRIBE [FILEEXISTS]

BFILEが存在するかどうかを確認します。

DESCRIBE [DIRECTORY,FILENAME]

BFILEのディレクトリ・オブジェクト名とファイル名を戻します。

10.6.7 Pro*C/C++: LOBロケータ埋込みSQL文

表10-25 Pro*C/C++: LOBロケータ埋込みSQL文

説明

ASSIGN

LOBロケータを別のLOBロケータに割り当てます。

FILE SET

BFILEのディレクトリ・オブジェクト名とファイル名をロケータに設定します。

10.6.8 Pro*C/C++: LOBバッファリングのための埋込みSQL文

表10-26 Pro*C/C++: LOBバッファリングのための埋込みSQL文

説明

DISABLE BUFFERING

バッファリング・サブシステムを使用禁止にします。

ENABLE BUFFERING

後続のLOBデータの読取り/書込みに、LOBバッファリング・サブシステムを使用します。

FLUSH BUFFER

LOBバッファリング・サブシステムへの変更を、データベース(サーバー)へフラッシュします。

10.6.9 Pro*C/C++: LOBをオープンおよびクローズするための埋込みSQL文

表10-27 Pro*C/C++: 永続LOBおよび外部LOB(BFILE)をオープンおよびクローズするための埋込みSQL文

説明

OPEN

LOBまたはBFILEをオープンします。

DESCRIBE [ISOPEN]

LOBまたはBFILEがオープンしているかどうかを確認します。

CLOSE

LOBまたはBFILEをクローズします。

10.7 COBOL(Pro*COBOL)を使用したLOBの作業

埋込みSQLを使用すると、永続LOBの全体、または永続LOBの初め、中、終わりの部分を変更できます。読取りを目的として内部LOBと外部LOBの両方にアクセスしたり、永続LOBに対して書込みを行うこともできます。

埋込みSQL文によって、BLOBCLOBNCLOBおよびBFILEに格納されたデータにアクセスできます。この種の文の詳細は後述します。

10.7.1 LOBを表す入力ロケータ・ポインタの割当て

PL/SQLのロケータとは異なり、Pro*COBOLのロケータはロケータ・ポインタにマップされ、LOBまたはBFILE値を参照するために使用されます。埋込みSQL LOB文を正常に実行するには、次の処理が必要です。

  1. 文を実行する前に、データベース表領域または外部ファイルシステムに存在するLOBを表す入力ロケータ・ポインタを割り当てます
  2. LOBロケータをLOBロケータ・ポインタ変数にSELECTします。
  3. 埋込みSQL LOB文でこの変数を使用し、LOB値にアクセスし操作します。

    関連項目:

    サポートされているLOB操作用のAPIについては、次の章を参照してください。

Pro*COBOLインタフェースが必要な機能を提供していない場合は、Cを使用してOCIをコールできます。このようなプログラムはオペレーティング・システムによって異なるため、ここでは例を示しません。

関連項目:

構文、ホスト変数、ホスト変数型およびサンプル・コードの詳細は、『Pro*COBOLプログラマーズ・ガイド』を参照してください。

10.7.2 Pro*COBOL: BLOB、CLOB、NCLOBおよびBFILEを操作する文

BLOB、CLOB、NCLOBおよびBFILEを操作するPro*COBOL文は、次のとおりです。

  • 永続LOBを変更するには、表10-28を参照してください。

  • 内部LOBおよび外部LOBの値の読取りまたはテストは、表10-29を参照してください。

  • 一時LOBの作成、解放、またはLOBロケータの確認は、表10-30を参照してください。

  • BFILEにおけるクローズおよびファイルの有無は、表10-31を参照してください。

  • LOBロケータでの操作は、表10-32を参照してください。

  • LOBのバッファリングは、表10-33を参照してください。

  • 永続LOBまたはBFILEのオープンまたはクローズは、表10-34を参照してください。

10.7.3 Pro*COBOL: 永続LOBの値を変更する埋込みSQL文

表10-28 Pro*COBOL: LOBの値を変更する埋込みSQL文

説明

APPEND

LOB値を別のLOBに追加します。

COPY

LOBの全体または一部を別のLOBにコピーします。

ERASE

指定のオフセットから開始して、LOBの一部を消去します。

LOAD FROM FILE

永続LOBの指定されたオフセットにBFILEデータをロードします。

TRIM

LOBを切り捨てます。

WRITE

LOBの指定されたオフセットにバッファのデータを書き込みます。

WRITE APPEND

バッファのデータをLOBの終わりに書き込みます。

10.7.4 Pro*COBOL: LOBのイントロスペクションに使用する埋込みSQL文

表10-29 Pro*COBOL: LOBのイントロスペクションに使用する埋込みSQL文

説明

DESCRIBE [CHUNKSIZE]

書込み用のチャンク・サイズを取得します。

DESCRIBE [LENGTH]

LOBまたはBFILEの長さを戻します。

READ

NULL以外のLOBまたはBFILEの指定部分をバッファに読み取ります。

10.7.5 Pro*COBOL: 一時LOBを操作する埋込みSQL文

表10-30 Pro*COBOL: 一時LOBを操作する埋込みSQL文

説明

CREATE TEMPORARY

一時LOBを作成します。

DESCRIBE [ISTEMPORARY]

LOBロケータが一時LOBを参照しているかどうかをチェックします。

FREE TEMPORARY

一時LOBを解放します。

10.7.6 Pro*COBOL: BFILE固有の埋込みSQL文

表10-31 Pro*COBOL: BFILE固有の埋込みSQL文

説明

FILE CLOSE ALL

オープンしているすべてのBFILEをクローズします。

DESCRIBE [FILEEXISTS]

BFILEが存在するかどうかを確認します。

DESCRIBE [DIRECTORY, FILENAME]

BFILEのディレクトリ・オブジェクト名とファイル名を戻します。

10.7.7 Pro*COBOL: LOBロケータ埋込みSQL文

表10-32 Pro*COBOL: LOBロケータ埋込みSQL文

説明

ASSIGN

LOBロケータを別のLOBロケータに割り当てます。

FILE SET

BFILEのディレクトリ・オブジェクト名とファイル名をロケータに設定します。

10.7.8 Pro*COBOL: LOBバッファリングのための埋込みSQL文

表10-33 Pro*COBOL: LOBバッファリングのための埋込みSQL文

説明

DISABLE BUFFERING

バッファリング・サブシステムを使用禁止にします。

ENABLE BUFFERING

後続のLOBデータの読取り/書込みに、LOBバッファリング・サブシステムを使用します。

FLUSH BUFFER

LOBバッファリング・サブシステムへの変更を、データベース(サーバー)へフラッシュします。

10.7.9 Pro*COBOL: LOBおよびBFILEをオープンおよびクローズするための埋込みSQL文

表10-34 Pro*COBOL: 永続LOBおよびBFILEをオープンおよびクローズするための埋込みSQL文

説明

OPEN

LOBまたはBFILEをオープンします。

DESCRIBE [ISOPEN]

LOBまたはBFILEがオープンしているかどうかを確認します。

CLOSE

LOBまたはBFILEをクローズします。

10.8 Java(JDBC)を使用したLOBの作業

Java(JDBC)を使用して、LOBに対して次の作業を行うことができます。

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.jarCLASSPATH内に配置します。JDK6を使用するには、ojdbc6.jarCLASSPATH内に配置します。ojdbc5.jarはJDBC 3.0仕様をサポートし、ojdbc6.jarは、JDK6での新規仕様であるJDBC4.0仕様をサポートします。

10.8.2 Javaを使用した内部永続LOBおよび外部LOB(BFILE)の読取り

JDBCインタフェースでは、Javaを使用して内部永続LOBと外部LOB(BFILE)の両方を読み取ることができます。

10.8.2.1 BLOB、CLOBおよびBFILEクラス
  • BLOBおよびCLOBクラス: JDBCでは、これらのクラスは、BLOBおよびCLOBのデータ型を含むデータベースでラージ・オブジェクトを操作するメソッドを提供します。

  • BFILEクラス: JDBCでは、このクラスは、データベース内のBFILEデータを操作するメソッドを提供します。

BLOBCLOBおよびBFILEクラスはLOBロケータをカプセル化するため、ユーザーは、ロケータではなく、提供されているメソッドおよびプロパティを使用して操作することで、状態情報を取得します。

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.5.3 JDBC-OCIドライバの考慮事項

JDBC-OCIドライバは、サーバーおよびネットワーク層でゼロコピー入力/出力をサポートしています。

10.8.6 Java(JDBC)を使用したLOBの参照

次の2つの方法で、前述のすべてのLOBを参照できます。

  • OracleResultSetの列として

  • OraclePreparedStatementOUT型PL/SQLパラメータとして

10.8.6.1 OracleResultSetの使用: 取り出されたBLOBとCLOBオブジェクト

OracleResultSetの一部としてBLOBオブジェクトとCLOBオブジェクトが取り出された場合、これらのオブジェクトは現在選択されている行のLOBロケータを表します。

移動操作(rset.next()など)によってカレント行が変更されても、取り出されたロケータは元のLOB行を参照したままです。

最新のカレント行のロケータを取り出すには、移動操作を行うたびに、インスタンスがBLOBCLOBまたはBFILEのいずれであるかに応じて、OracleResultSet上でgetBLOB()getCLOB()またはgetBFILE()をコールする必要があります。

10.8.7 JDBC構文の参照および詳細

LOBでのJDBCの使用に関するJDBC構文および詳細は、次のドキュメントを参照してください。

関連項目:

  • パラメータ、パラメータ・タイプ、戻り値およびサンプル・コードの詳細は、『Oracle Database JDBC開発者ガイド』を参照してください。

  • http://www.oracle.com/technology/

10.8.8 LOBでの操作のためのJDBCメソッド

BLOBCLOBおよびBFILEを操作するJDBCメソッドは、次のとおりです。

  • BLOB:

    • BLOBの値を変更するには、表10-35を参照してください。

    • BLOB値の読取りまたはテストは、表10-36を参照してください。

    • BLOBのバッファリングは、表10-37を参照してください。

    • 一時BLOB: BLOBの作成、BLOBがオープンしているかどうかの確認および一時BLOBの解放について。表10-45を参照してください

    • BLOBのオープン、クローズ、およびBLOBがオープンしているかどうかの確認は、表10-45を参照してください。

    • BLOBの切捨ては、表10-48を参照してください。

    • BLOBストリーミングAPIは、表10-50を参照してください。

  • CLOB:

    • CLOB値の読取りまたはテストは、表10-39を参照してください。

    • CLOBのバッファリングは、表10-40を参照してください。

    • CLOBを変更するには、表10-50を参照してください。

  • 一時CLOB:

    • CLOBのオープン、クローズ、およびCLOBがオープンしているかどうかの確認は、表10-46を参照してください。

    • CLOBの切捨ては、表10-49を参照してください。

    • CLOBストリーミングAPIは、表10-51を参照してください。

  • BFILE:

    • BFILEの読取りまたはテストは、表10-41を参照してください。

    • BFILEのバッファリングは、表10-42を参照してください。

    • BFILEのオープン、クローズ、およびBFILEがオープンしているかどうかの確認は、表10-47を参照してください。

    • BFILEストリーミングAPIは、表10-52を参照してください。

10.8.9 JDBC: BLOB値を変更するoracle.sql.BLOBメソッド

表10-35 JDBC: BLOB値を変更するoracle.sql.BLOBメソッド

メソッド 説明

int setBytes(long, byte[])

指定されたオフセットから、バイト配列をBLOBに挿入します。

10.8.10 JDBC: BLOB値の読取りまたはテストを行うoracle.sql.BLOBメソッド

表10-36 JDBC: BLOB値の読取りまたはテストを行うoracle.sql.BLOBメソッド

メソッド 説明

byte[] getBytes(long, int)

指定されたオフセットから、バイトの配列としてLOBの内容を取得します。

long position(byte[],long)

LOB内の指定されたバイト配列を、指定されたオフセットで検索します。

long position(Blob,long)

指定されたBLOBをLOB内で検索します。

public boolean equals(java.lang.Object)

このLOBを別のLOBと比較します。LOBロケータを相互に比較します。

public long length()

LOBの長さを戻します。

public int getChunkSize()

LOBのチャンク・サイズを戻します。

10.8.11 JDBC: BLOBバッファリングのためのoracle.sql.BLOBメソッドおよびプロパティ

表10-37 JDBC: BLOBバッファリングのためのoracle.sql.BLOBメソッドおよびプロパティ

メソッド 説明

public java.io.InputStream getBinaryStream())

LOBをバイナリ・ストリームとして流すストリームを戻します。

public java.io.OutputStream setBinaryStream()

このBlobオブジェクトが表すBLOB値に書き込むために使用できるストリームを取り出します。

10.8.12 JDBC: CLOB値を変更するoracle.sql.CLOBメソッド

表10-38 JDBC: CLOB値を変更するoracle.sql.CLOBメソッド

メソッド 説明

int setString(long, java.lang.String)

JDBC 3.0: このClobオブジェクトが指定するCLOB値のposの位置に、指定されたJava文字列を書き込みます。

int putChars(long, char[])

指定されたオフセットから、文字配列をLOBに挿入します。

10.8.13 JDBC: CLOB値の読取りまたはテストを行うoracle.sql.CLOBメソッド

表10-39 JDBC: CLOB値の読取りまたはテストを行うoracle.sql.CLOBメソッド

メソッド 説明

java.lang.String getSubString(long, int)

LOBの部分文字列を文字列として戻します。

int getChars(long, int, char[])

LOBのサブセットを文字配列に読み取ります。

long position(java.lang.String, long)

指定された文字列をLOB内の指定されたオフセットから検索します。

long position(oracle.jdbc2.Clob, long)

指定されたCLOBをLOB内の指定されたオフセットから検索します。

long length()

LOBの長さを戻します。

int getChunkSize()

LOBのチャンク・サイズを戻します。

10.8.14 JDBC: CLOBバッファリングのためのoracle.sql.CLOBメソッドおよびプロパティ

表10-40 JDBC: CLOBバッファリングのためのoracle.sql.CLOBメソッドおよびプロパティ

メソッド 説明

java.io.InputStream getAsciiStream()

Clobインタフェースのメソッドを実装します。このClobオブジェクトで指定されたCLOB値をASCIIのバイト・ストリームとして取得します。

java.io.OutputStream setAsciiStream(long pos)

JDBC 3.0: このClobオブジェクトが表すCLOB値に、posの位置からASCII文字を書き込むために使用するストリームを取り出します。

java.io.Reader getCharacterStream()

CLOBを文字ストリームとして読み取ります。

java.io.Writer setCharacterStream(long pos)

JDBC 3.0: このClobオブジェクトが表すCLOB値に、posの位置からUnicode文字を書き込むために使用できるストリームを取り出します。

10.8.15 JDBC: 外部LOB(BFILE)値の読取りまたはテストを行うoracle.sql.BFILEメソッド

表10-41 JDBC: 外部LOB(BFILE)値の読取りまたはテストを行うoracle.sql.BFILEメソッド

メソッド 説明

byte[] getBytes(long, int)

指定されたオフセットから、バイトの配列としてBFILEの内容を取得します。

int getBytes(long, int, byte[])

BFILEのサブセットをバイト配列に読み取ります。

long position(oracle.sql.BFILE, long)

指定されたオフセットから、LOB内の指定されたBFILEの内容の1番目のものを検索します。

long position(byte[],long)

指定されたオフセットから、BFILE内の指定されたバイト配列の1番目のものを検索します。

long length()

BFILEの長さを戻します。

boolean fileExists()

このBFILEが参照しているオペレーティング・システム・ファイルが存在するかどうかを確認します。

public void openFile()

このBFILEが参照しているオペレーティング・システム・ファイルをオープンします。

public void closeFile()

このBFILEが参照しているオペレーティング・システム・ファイルをクローズします。

public boolean isFileOpen()

BFILEがオープンしているかどうかを確認します。

public java.lang.String getDirAlias()

このBFILEのディレクトリ・オブジェクト名を取得します。

public java.lang.String getName()

このBFILEが参照しているファイル名を取得します。

10.8.16 JDBC: BFILEバッファリングのためのoracle.sql.BFILEメソッドおよびプロパティ

表10-42 JDBC: BFILEバッファリングのためのoracle.sql.BFILEメソッドおよびプロパティ

メソッド 説明

public java.io.InputStream getBinaryStream()

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-43 JDBC: 一時BLOB API

メソッド 説明

public static BLOB createTemporary(Connection conn,

boolean cache, int duration) throws SQLException

一時BLOBを作成します。

public static boolean isTemporary(BLOB blob)

throws SQLException

指定のBLOBロケータが一時BLOBを参照するかどうかを確認します。

public boolean isTemporary() throws SQLException

現行のBLOBロケータが一時BLOBを参照するかどうかを確認します。

public static void freeTemporary(BLOB temp_blob)

throws SQLException

指定の一時BLOBを解放します。

public void freeTemporary() throws SQLException

一時BLOBを解放します。

表10-44 JDBC: 一時CLOB API

メソッド 説明

public static CLOB createTemporary(Connection conn,

boolean cache, int duration) throws SQLException

一時CLOBを作成します。

public static boolean isTemporary(CLOB clob)

throws SQLException

指定のCLOBロケータが一時CLOBを参照するかどうかを確認します。

public boolean isTemporary() throws SQLException

現行のCLOBロケータが一時CLOBを参照するかどうかを確認します。

public static void freeTemporary(CLOB temp_clob)

throws SQLException

指定の一時CLOBを解放します。

public void freeTemporary() throws SQLException

一時CLOBを解放します。

10.8.18 JDBC: LOBのオープンおよびクローズ

oracle.sql.CLOBクラスは、標準JDBCのjava.sql.ClobインタフェースをOracle JDBCドライバに実装したものです。表10-44は、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-45は、oracle.sql.BLOBでBLOBをオープンおよびクローズするためのOracle拡張APIを示しています。

表10-45 JDBC: BLOBのオープンおよびクローズ

メソッド 説明

public void open(int mode) throws SQLException

BLOBをオープンします

public boolean isOpen() throws SQLException

BLOBがオープンしているかどうかを確認します。

public void close() throws SQLException

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.19.3 JDBCを使用したBLOBのクローズ

JDBCアプリケーションは、oracle.sql.BLOBに定義されているCLOSEメソッドを使用してBLOBをクローズできます。CLOSE APIの定義は次のとおりです。

/** 
  * Close a previously opened BLOB. 
  */ 
public void close () throws SQLException

次に例を示します。

BLOB blob = ... 
// close the BLOB 
blob.close ();

10.8.20 JDBC: CLOBのオープンおよびクローズ

oracle.sql.CLOBクラスは、標準JDBCのjava.sql.ClobインタフェースをOracle JDBCドライバに実装したものです。表10-46は、oracle.sql.CLOBCLOBをオープンおよびクローズするためのOracle拡張APIを示しています。

表10-46 JDBC: CLOBのオープンおよびクローズ

メソッド 説明

public void open(int mode) throws SQLException

CLOBをオープンします

public boolean isOpen() throws SQLException

CLOBがオープンしているかどうかを確認します。

public void close() throws SQLException

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.20.3 JDBCを使用したCLOBのクローズ

JDBCアプリケーションは、oracle.sql.CLOBに定義されているCLOSEメソッドを使用してCLOBをクローズできます。CLOSE APIの定義は次のとおりです。

/** 
* Close a previously opened CLOB. 
*/ 
public void close () throws SQLException

次に例を示します。

CLOB clob = ... 
// close the CLOB 
clob.close ();

10.8.21 JDBC: BFILEのオープンおよびクローズ

oracle.sql.BFILEクラスは、データベースBFILEオブジェクトをラップします。表10-47は、oracle.sql.BFILEBFILEをオープンおよびクローズするOracle拡張APIを示しています。

表10-47 BFILEをオープンおよびクローズするためのJDBC拡張API

メソッド 説明

public void open() throws SQLException

BFILEをオープンします。

public void open(int mode) throws SQLException

BFILEをオープンします。

public boolean isOpen() throws SQLException

BFILEがオープンしているかどうかを確認します。

public void close() throws SQLException

BFILEをクローズします

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-48は、oracle.sql.BLOBでBLOBを切り捨てるためのOracle拡張APIを示しています。

表10-48 JDBC: BLOBの切捨て

メソッド 説明

public void truncate(long newlen) throws SQLException

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-49は、oracle.sql.CLOBCLOBを切り捨てるためのOracle拡張APIを示しています。

表10-49 JDBC: CLOBの切捨て

メソッド 説明

public void truncate(long newlen) throws SQLException

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-50は、BLOBストリーミングAPIを示しています。

表10-50 JDBC: BLOBストリーミングAPI

メソッド 説明

public java.io.OutputStream

setBinaryStream (long pos) throws SQLException

JDBC 3.0: このBlobオブジェクトが表すBLOB値に、posの位置から書き込むために使用できるストリームを取り出します。

public java.io.InputStream

getBinaryStream() throws SQLException

JDBC 3.0: このBlobオブジェクトが表すBLOB値を、最初から読み取るために使用できるストリームを取り出します。

public java.io.InputStream

getBinaryStream(long pos) throws SQLException

Oracle拡張機能: このBlobオブジェクトが表すBLOB値を、posの位置から読み取るために使用できるストリームを取り出します。

これらの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-51は、CLOBストリーミングAPIを示しています。

表10-51 JDBC: CLOBストリーミングAPI

メソッド 説明

public java.io.OutputStream

setAsciiStream (long pos) throws SQLException

JDBC 3.0: このClobオブジェクトが表すCLOB値に、posの位置からASCII文字を書き込むために使用するストリームを取り出します。

public java.io.Writer

setCharacterStream (long pos) throws SQLException

JDBC 3.0: このClobオブジェクトが表すCLOB値に、posの位置からUnicode文字を書き込むために使用できるストリームを取り出します。

public java.io.InputStream

getAsciiStream() throws SQLException

JDBC 3.0: このClobオブジェクトが表すCLOB値のASCII文字を、最初から読み取るために使用できるストリームを取り出します。

public java.io.InputStream

getAsciiStream(long pos) throws SQLException

Oracle拡張機能: このClobオブジェクトが表すCLOB値のASCII文字を、posの位置から読み取るために使用できるストリームを取り出します。

public java.io.Reader

getCharacterStream() throws SQLException

JDBC 3.0: このClobオブジェクトが表すCLOB値のUnicode文字を、最初から読み取るために使用できるストリームを取り出します。

public java.io.Reader

getCharacterStream(long pos) throws SQLException

Oracle拡張機能: このClobオブジェクトが表すCLOB値のUnicode文字を、posの位置から読み取るために使用できるストリームを取り出します。

これらの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-52は、oracle.sql.BFILEBFILEの内容を、要求された位置から読み取るOracle拡張APIを示しています。

表10-52 JDBC: BFILEストリーミングAPI

メソッド 説明

public java.io.InputStream

getBinaryStream(long pos)throws SQLException

BFILEからストリームとして読み取ります。

これらの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型をサポートします。

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(BLOBCLOBNCLOBおよびBFILE)が.NETを使用する固有のデータ型としてサポートされます。

COMおよび.NETは補足的な開発テクノロジです。Microsoftでは、新規開発にはCOMではなく.NET Frameworkを使用することを開発者に薦めています。