この章の内容は次のとおりです。
表13-1に、LOB機能をサポートするプログラム環境を示します。
関連項目: サポートされているLOB操作用のAPIについては、次の章を参照してください。 |
表13-1 LOBをサポートするプログラム環境
言語 | プリコンパイラまたはインタフェース・プログラム | 構文についての参照先 | この章での参照先 |
---|---|---|---|
DBMS_LOBパッケージ |
『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』 |
||
C |
OCI |
『Oracle Call Interfaceプログラマーズ・ガイド』 |
|
C++ |
OCCI |
『Oracle C++ Call Interfaceプログラマーズ・ガイド』 |
|
C/C++ |
Pro*C/C++プリコンパイラ |
『Pro*C/C++プログラマーズ・ガイド』 |
|
COBOL |
Pro*COBOLプリコンパイラ |
『Pro*COBOLプログラマーズ・ガイド』 |
|
COM |
Oracle Objects For OLE (OO4O) |
『Oracle Objects for OLE開発者ガイド』 |
|
Java |
JDBC API |
『Oracle Database JDBC開発者ガイドおよびリファレンス』 |
|
ADO/OLE DB |
Oracle Provider for OLE DB(OraOLEDB) |
『Oracle Provider for OLE DB開発者ガイド』 |
「Oracle Provider for OLE DB(OraOLEDB)」 |
.NET |
Oracle Data Provider for .NET(ODP.NET) |
『Oracle Data Provider for .NET開発者ガイド』 |
「Oracle Data Provider for .NET(ODP.NET)の概要」 |
表13-2および表13-3では、8つのプログラム用LOBインタフェースについて、LOB操作に使用するそれぞれのファンクションおよびメソッドをリストし、比較しています。表が2つに分かれているのは、単に8つのインタフェースすべてを記載するためです。これらのインタフェースのLOBに関する機能については、この後の項で説明します。
表13-2 LOBインタフェースの比較(1/2)
表13-3 LOBインタフェースの比較(2/2)
PL/SQL DBMS_LOB
パッケージは、次の操作のために使用できます。
内部永続LOBおよび一時LOB: 全体またはピース単位の読取りおよび変更操作
BFILE: 読取り操作
関連項目: パラメータ、パラメータ・タイプ、戻り値およびサンプル・コードの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。 |
詳しく後述するように、DBMS_LOB
ルーチンはLOBロケータに基づいて機能します。DBMS_LOB
ルーチンを正常に実行するには、ルーチンをコールする前に、データベース表領域または外部ファイルシステムに存在しているLOBを示す入力ロケータを用意する必要があります。
永続LOB: SQLを使用してLOB列を含む表を定義します。その後、SQLを使用してこれらのLOB列のロケータを初期化または移入できます。
外部LOB: アクセス対象の外部LOBを含む有効物理ディレクトリにマップする、DIRECTORY
オブジェクトを定義します。これらのファイルは存在し、Oracleサーバーで処理を行うための読取り権限を所有している必要があります。オペレーティング・システムがパス名の大/小文字を区別する場合には、正しい大/小文字でディレクトリを指定してください。詳細は、「ディレクトリ・オブジェクト」を参照してください。
一度LOBを定義して作成すると、SELECT
を実行してLOBロケータをローカルのPL/SQL LOB変数に割り当てることができます。また、この変数を、LOB値にアクセスするためのDBMS_LOB
への入力パラメータとして使用できます。
次の項では、各DBMS_LOB
ルーチンで提供されている例を使用して、前述の操作について説明します。
DBMS_LOB
PL/SQLパッケージのプロシージャで使用されるオフセット・パラメータと量パラメータには、次のガイドラインが適用されます。
文字データ(すべての形式、固定幅および可変幅)の場合、amount
パラメータとoffset
パラメータは文字単位です。これは、CLOB
データ型とNCLOB
データ型に対する操作に適用されます。
バイナリ・データの場合、offset
パラメータとamount
パラメータはバイト単位です。このガイドラインはBLOB
データ型に対する操作に適用されます。
次のプロシージャを使用する場合のガイドライン
量パラメータには、ロード元のBFILE
のサイズを超える値を指定できません。これらのプロシージャを使用してBFILE
全体をロードするには、BFILE
の正確なサイズまたは最大許容記憶域の上限を指定する必要があります。
DBMS_LOB.READ
を使用する場合、amount
パラメータはデータより大きいサイズに指定できます。バッファ・サイズ以下の値を指定する必要があります。バッファ・サイズの上限は32KBです。
キャラクタ・セットIDを取得するには、キャラクタ・セット名を知っている必要があります(データベース・キャラクタ・セットおよび各国語キャラクタ・セットの有効なキャラクタ・セット名がリストされているV$NLS_VALID_VALUES
ビューから選択できます)。次に、目的のキャラクタ・セット名を1つの文字列引数に指定したNLS_CHARSET_ID
ファンクションをコールします。キャラクタ・セットIDが整数で戻されます。UTF16
には、キャラクタ・セット名がないので、正しく動作しません。UTF16
には、キャラクタ・セットIDとして1000を使用します。UTF16
は、データベース・キャラクタ・セットまたは各国語キャラクタ・セットとしては許可されていませんが、DBMS_LOB
のAPIではデータベース変換用にサポートされています。DBMS_LOB.LOADCLOBFROMFILE
およびDBMS_LOB
の他のプロシージャは、キャラクタ・セット名ではなくキャラクタ・セットIDを入力として受け取ります。
関連項目:
|
次の表に、DBMS_LOB
プロシージャを示します。
表13-4 PL/SQL: LOB値を変更するDBMS_LOBプロシージャ
関数/プロシージャ | 説明 |
---|---|
APPEND |
LOB値を別のLOBに追加します。 |
CONVERTTOBLOB |
|
CONVERTTOCLOB |
|
COPY |
LOBの全体または一部を他のLOBにコピーします。 |
ERASE |
指定のオフセットから開始して、LOBの一部を消去します。 |
FRAGMENT_DELETE |
LOBの指定されたオフセットから指定された長さのデータを削除します。 |
FRAGMENT_INSERT |
LOBの指定されたオフセットに、指定されたデータ(32KB未満)を挿入します。 |
FRAGMENT_MOVE |
指定されたオフセットから他の指定されたオフセットに、指定されたバイト数を移動します。 |
FRAGMENT_REPLACE |
指定されたオフセットのデータを、指定されたデータ(32KB未満)と置換します。 |
LOADFROMFILE |
|
LOADCLOBFROMFILE |
キャラクタ・セットをファイルからLOBにロードします。 |
LOADBLOBFROMFILE |
バイナリ・データをファイルからLOBにロードします。 |
SETOPTIONS |
LOB機能(重複除外および圧縮)を設定します。 |
TRIM |
指定された長さまでLOB値を切り捨てます。 |
WRITE |
指定されたオフセットからLOBにデータを書き込みます。 |
WRITEAPPEND |
データをLOBの終わりに書き込みます。 |
表13-5 PL/SQL: 内部LOBおよび外部LOBの値の読取りまたはテストを行うDBMS_LOBプロシージャ
関数/プロシージャ | 説明 |
---|---|
COMPARE |
2つのLOBの値を比較します。 |
GETCHUNKSIZE |
読取りおよび書込み用にチャンク・サイズを取得します。これは永続LOBにのみ適用され、外部LOB( |
GETLENGTH |
LOB値の長さを取得します。 |
GETOPTIONS |
SecureFilesのオプション(重複除外、圧縮、暗号化)を戻します。 |
GET_STORAGE_LIMIT |
データベース構成のLOB記憶域制限を取得します。 |
INSTR |
LOBにおけるパターンのn番目の出現位置を戻します。 |
ISSECUREFILE |
このファンクションは、渡される |
READ |
指定されたオフセットからLOBのデータを読み取ります。 |
SETOPTIONS |
デフォルトのLOB列の設定を上書きする、SecureFilesのオプション(重複除外および圧縮)を設定します。サーバーへのラウンドトリップが発生します。 |
SUBSTR |
指定されたオフセットからLOB値の一部を戻します。 |
表13-7 PL/SQL: BFILE固有のDBMS_LOB読取り専用プロシージャ
関数/プロシージャ | 説明 |
---|---|
FILECLOSE |
ファイルをクローズします。 |
FILECLOSEALL |
オープンしていたすべてのファイルをクローズします。 |
FILEEXISTS |
ファイルがサーバー上に存在するかどうかを確認します。 |
FILEGETNAME |
ディレクトリ・オブジェクト名とファイル名を取得します。 |
FILEISOPEN |
入力 |
FILEOPEN |
ファイルをオープンします。 |
表13-8 PL/SQL: 内部LOBおよび外部LOBをオープンおよびクローズするDBMS_LOBプロシージャ
関数/プロシージャ | 説明 |
---|---|
OPEN |
LOBをオープンします。 |
ISOPEN |
LOBがオープンしているかどうかを確認します。 |
CLOSE |
LOBをクローズします。 |
「OPENおよびCLOSEインタフェースを使用した永続LOBのオープン」では、特定のLOB操作(LOBを含む行の挿入など)について、これらのプロシージャをさらに詳しく説明します。
Oracle Call Interface(OCI)のLOB関数を使用すると、CでLOBにアクセスして変更し、BFILE
からデータを読み取ることができます。
関連項目: この項で説明するすべての内容の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』の「LOBおよびBFILEの操作」の章を参照してください。 |
小さいLOBのOCIアクセスを向上するため、ロケータもフェッチしながら、LOBデータをプリフェッチおよびキャッシュできます。これは、内部LOB、一時LOBおよびBFILE
に適用されます。
データを2バイトのUnicode(UCS2)フォーマットで読取りまたは書込みする場合は、OCILobRead2()
およびOCILobWrite2()
のcsid
(キャラクタ・セットID)パラメータをOCI_UTF16ID
に設定します。CSID
パラメータは、バッファ・パラメータ用のCSIDを示します。csid
パラメータは、すべてのCSIDに設定できます。csid
パラメータが設定されていると、環境変数NLS_LANG
より優先されます。
関連項目:
|
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
に書き込まれた文字数を表します。
OCILobLoadFromFile2()
を使用する場合、量パラメータに、
BFILE
の長さより長い値を指定することはできません。BFILE
全体をロードするには、OCILobGetStorageLimit()
の戻り値を渡します。
OCILobRead2()
を使用してLOBの終わりまで読み取るには、OCILobGetStorageLimit()
の戻り値と等しい量を指定します。詳細は、「LOBからのデータの読取り」を参照してください。
OCIプログラムでOCILobLocator
ポインタを割り当てる場合は、特殊事例として=代入演算子を使用する必要があります。ポインタの割当てによりLOBのシャロー・コピーが作成されます。ポインタの割当て後は、ソースLOBとターゲットLOBが同じデータ・コピーを指します。
これらのセマンティクスは、割当ての実行にOCILobAssign()
やOCILobLocatorAssign()
などのLOB APIを使用する場合とは異なります。これらのAPIを使用すると、割当て後のロケータは独立したデータ・コピーを論理的に指します。
一時LOBの場合は、ポインタ割当てを実行する前にOCIFreeTemporary()
をコールして、ターゲットLOBロケータ内の一時LOBが解放されていることを確認する必要があります。これに対して、OCILobLocatorAssign()
を使用すると、割当てが発生する前に、ターゲットLOBロケータ変数内の元の一時LOB(存在する場合)が自動的に解放されます。
SQL文の定義変数またはアウトバインド変数内でLOBロケータを再利用する前に、OCIFreeTemporary()
を使用して既存のLOBロケータ・バッファ内の一時LOBを解放する必要があります。
表13-9 OCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更する関数
関数/プロシージャ | 説明 |
---|---|
|
LOB値を別のLOBに追加します。 |
|
1回のラウンドトリップで複数のロケータを使用してデータを書き込みます。 |
|
LOBの全体または一部を他のLOBにコピーします。 |
|
指定のオフセットから開始して、LOBの一部を消去します。 |
|
|
|
SecureFilesにコンテンツ文字列を設定します。 |
|
SecureFilesのオプション設定(重複除外および圧縮)を使用可能にします。 |
|
LOBを切り捨てます。 |
|
バッファのデータをLOBに書き込み、既存データを上書きします。 |
|
バッファのデータをLOBの終わりに書き込みます。 |
表13-10 OCI: 永続LOBおよび外部LOB(BFILE)の値の読取りまたはテストを行う関数
関数/プロシージャ | 説明 |
---|---|
|
1回のラウンドトリップで複数のロケータを使用してデータを読み取ります。 |
|
読取りおよび書込み用にチャンク・サイズを取得します。これは永続LOBに適用され、外部LOB( |
|
SecureFilesのコンテンツ文字列を取得します。 |
|
LOBまたは |
|
指定されたSecureFilesの使用可能な設定(重複除外、圧縮および暗号化)を取得します。 |
|
内部LOBの最大長を取得します。 |
|
|
表13-13 OCI: LOBロケータ関数
関数/プロシージャ | 説明 |
---|---|
|
LOBロケータを別のLOBロケータに割り当てます。 |
|
LOBのキャラクタ・セット・フォームを戻します。 |
|
LOBのキャラクタ・セットIDを戻します。 |
|
|
|
2つのLOBロケータが同じLOBを参照しているかどうかを確認します。 |
|
LOBロケータが初期化されているかどうかを確認します。 |
Oracle C++ Call Interface (OCCI)は、Oracle Databaseでデータを操作するためのC++ APIです。OCCIは、使いやすいC++クラス・セットとして構成されています。これにより、C++プログラムでは、データベースへの接続、SQL文の実行、データベース表への値の挿入とデータベース表の値の更新、問合せ結果の取得、データベースでのストアド・プロシージャの実行、データベース・スキーマ・オブジェクトのメタデータへのアクセスが可能になります。また、OCCIには、ユーザー定義型のオブジェクトをC++クラス・インスタンスとして操作するためのシームレスなインタフェースも用意されています。
OCCIは、OCIとともに使用することによって、アプリケーションを構築できます。
OCCI APIには、JDBCおよびODBCと比べて次のメリットがあります。
OCCIにはJDBCより多くのOracle機能があります。OCCIは、JDBCにないすべてのOCI機能を提供します。
OCCIは、コンパイル型のパフォーマンスを実現します。コンパイル型のプログラムでは、ソース・コードは、可能なかぎり初めからコンピュータ言語に近いコードで記述されています。JDBCはインタプリタ型APIであるため、コンパイル型APIほどのパフォーマンスは実現できません。インタプリタ型のプログラムでは、コードの各行を1行ずつコンピュータ言語に近いコードに解析する必要があるため、パフォーマンスが低下します。
OCCIでは、スマート・ポインタを使用してメモリーを管理できます。OCCIオブジェクトのメモリー管理に注意する必要がありません。そのため、アプリケーション・コードのパフォーマンスが大幅に向上します。
OCCIのナビゲーショナル・アクセスによって、直観的にオブジェクトにアクセスし、メソッドをコールできます。オブジェクトへの変更を持続するために、対応するSQL文を記述する必要はありません。クライアント側のキャッシュを使用する場合、オブジェクト・インタフェースよりナビゲーショナル・アクセス用インタフェースの方がパフォーマンスが高くなります。
ODBCに関しては、OCCI APIの方が簡単に使用できます。ODBCはC言語で構築されていますが、OCCIには、CにはないC++のすべてのメリットがあります。さらに、ODBCの習得は簡単ではないとされています。それに対してOCCIは、使いやすさを基に設計されています。
OCCIを使用すると、次のように、永続LOBの全体、初め、中または終わりの部分を変更できます。
内部LOBおよび外部LOB(BFILE
)からの読取り
永続LOBへの書込み
OCCIには、C++アプリケーションで各種のLOBインスタンスをオブジェクトとして使用できるように、次のクラスが用意されています。
Blob
クラス: 内部BLOB
に格納されているデータにアクセスし、データを変更します。
Bfile
クラス: 外部LOB(BFILE
)に格納されているデータにアクセスし、データを読み取ります。
関連項目: 各クラスの構文情報とOCCIの詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』を参照してください。 |
Clobドライバは、SQL LOBロケータを使用してCLOB
オブジェクトを実装します。これは、CLOBオブジェクトに、データ自体ではなくSQL CLOB
データへの論理ポインタが含まれていることを意味します。
CLOB
インタフェースでは、SQL CLOB
値の長さの取得、クライアント上のCLOB
値のマテリアライズ化、および部分文字列の取得を実行するためのメソッドが提供されます。ResultSet
インタフェースおよびStatement
インタフェースのgetClob()
やsetClob()
などのメソッドを使用すると、SQL CLOB
値にアクセスできます。
関連項目: Clobクラスの詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』を参照してください。 |
ResultSet
インタフェースおよびStatement
インタフェースのgetBlob()
やsetBlob()
などのメソッドを使用すると、SQL BLOB
値にアクセスできます。Blob
インタフェースでは、SQL BLOB
値の長さの取得、クライアント上のBLOB
値のマテリアライズ化、およびBLOB
の一部の抽出を実行するためのメソッドが提供されます。
関連項目:
|
OCCIの場合、固定幅のクライアント側キャラクタ・セットには、次の規則が適用されます。
Clob
: オフセット・パラメータおよび量パラメータは、常に文字で表されます。
Blob
: オフセット・パラメータおよび量パラメータは、常にバイトで表されます。
Bfile
: オフセット・パラメータおよび量パラメータは、常にバイトで表されます。
可変幅のクライアント側キャラクタ・セットに対しては、次の規則が適用されます。
オフセット・パラメータ: クライアント側キャラクタ・セットが可変幅かどうかにかかわらず、オフセット・パラメータは常に次のように表されます。
Clob()
: 文字で表されます。
Blob()
: バイトで表されます。
Bfile()
: バイトで表されます。
量パラメータ: 量パラメータは、常に次のように表されます。
Clob
: サーバー側LOBを参照する場合は文字で表されます。
Blob
: クライアント側バッファを参照する場合はバイトで表されます。
Bfile
: クライアント側バッファを参照する場合はバイトで表されます。
length(): クライアント側キャラクタ・セットが可変幅かどうかにかかわらず、出力の長さは次のように表されます。
Clob.length()
: 文字で表されます。
Blob.length()
: バイトで表されます。
Bfile.length()
: バイトで表されます。
Clob.read()およびBlob.read(): 可変幅のクライアント側キャラクタ・セット、CLOB
およびNCLOB
では次のようになります。
入力量は、文字で表されます。入力量は、サーバー側のCLOB
またはNCLOB
から読み取られる文字数を表します。
出力量は、バイトで表されます。出力量は、OCCIバッファ・パラメータbuffer
に読み取られたバイト数を表します。
Clob.write()およびBlob.write(): 可変幅のクライアント側キャラクタ・セット、CLOB
およびNCLOB
では次のようになります。
入力量は、バイトで表されます。入力量は、OCCI入力バッファbuffer
にあるデータのバイト数を表します。
出力量は、文字で表されます。出力量は、サーバー側のCLOB
またはNCLOB
に書き込まれた文字数を表します。
その他すべてのOCCI LOB操作については、クライアント側キャラクタ・セットかどうかにかかわらず、量パラメータはCLOB
およびNCLOB
については文字で表されます。内容は次のとおりです。
Clob.copy()
Clob.erase()
Clob.trim()
LoadFromFile機能用にオーバーロードされたClob.copy()
これらの操作はすべて、サーバー上のLOBデータの量に関する操作です。
関連項目: 『Oracle Databaseグローバリゼーション・サポート・ガイド』 |
Clob
およびBlob
にcopy()
メソッドを使用すると、BFILE
からデータをロードできます。このメソッドの量パラメータには、次のいずれかの値を渡すことができます。
データの一部をロードする場合は、BFILE
のサイズよりも小さい量。
データ全体をロードする場合は、BFILE
のサイズと等しい量。
BFILE
データをすべてロードする場合は、UB8MAXVAL
定数。
BFILE
のサイズより大きいサイズは指定できません。
Clob
、Blob
またはBfile
オブジェクトに対するread()
メソッドは、BFILE
からデータを読み取ります。量パラメータの次のいずれかの値を渡して、読み取るデータ量を指定できます。
データの一部をロードする場合は、BFILE
のサイズよりも小さい量。
データ全体をロードする場合は、BFILE
のサイズと等しい量。
BFILE
の終わりまでストリーム・モードで読み取る場合は、0
(ゼロ)。
BFILE
のサイズより大きいサイズは指定できません。
関連項目:
|
表13-17 OCCI: 永続LOBおよびBFILEの値の読取りまたはテストを行うBlob、ClobおよびBfileのメソッド
関数/プロシージャ | 説明 |
---|---|
|
読取りおよび書込み用にチャンク・サイズを取得します。これは永続LOBに適用され、外部LOB( |
|
既存および新規に作成されたLOBの設定を取得します。 |
|
LOBまたは |
|
|
|
既存および新規に作成されたLOB設定を使用可能にします。 |
表13-19 他のOCCI LOBメソッド
メソッド | 説明 |
---|---|
|
LOBロケータを別のLOBロケータに割り当てます。= |
|
LOBのキャラクタ・セット・フォームを戻します。 |
|
LOBのキャラクタ・セットIDを戻します。 |
|
|
|
2つのLOBが同じLOBを参照しているかどうかを確認します。 |
|
LOBが初期化されているかどうかを確認します。 |
埋込みSQLを使用すると、永続LOBの全体、またはLOBの初め、中、終わりの部分を変更できます。読取りを目的として内部LOBと外部LOBの両方にアクセスしたり、永続LOBに対して書込みを行うことができます。
埋込みSQL文によって、BLOB
、CLOB
、NCLOB
およびBFILE
に格納されたデータにアクセスできます。この種の文の詳細は後述します。
関連項目: 構文、ホスト変数、ホスト変数型およびサンプル・コードの詳細は、『Pro*C/C++プログラマーズ・ガイド』を参照してください。 |
PL/SQLのロケータとは異なり、Pro*C/C++のロケータはロケータ・ポインタにマップされ、LOBまたはBFILE値を参照するために使用できます。
埋込みSQL LOB文を正常に実行するには、次の処理が必要です。
埋込みSQLを使用すると、永続LOBの全体、または永続LOBの初め、中、終わりの部分を変更できます。読取りを目的として内部LOBと外部LOBの両方にアクセスしたり、永続LOBに対して書込みを行うこともできます。
埋込みSQL文によって、BLOB
、CLOB
、NCLOB
およびBFILE
に格納されたデータにアクセスできます。この種の文の詳細は後述します。
PL/SQLのロケータとは異なり、Pro*COBOLのロケータはロケータ・ポインタにマップされ、LOBまたはBFILE値を参照するために使用されます。埋込みSQL LOB文を正常に実行するには、次の処理が必要です。
文を実行する前に、データベース表領域または外部ファイルシステムに存在するLOBを表す入力ロケータ・ポインタを割り当てます。
LOBロケータをLOBロケータ・ポインタ変数にSELECTします。
埋込みSQL LOB文でこの変数を使用し、LOB値にアクセスし操作します。
関連項目: サポートされているLOB操作用のAPIについては、次の章を参照してください。 |
Pro*COBOLインタフェースが必要な機能を提供していない場合は、Cを使用してOCIをコールできます。このようなプログラムはオペレーティング・システムによって異なるため、ここでは例を示しません。
関連項目: 構文、ホスト変数、ホスト変数型およびサンプル・コードの詳細は、『Pro*COBOLプログラマーズ・ガイド』を参照してください。 |
Oracle Objects for OLE (OO4O)は、プログラム可能なCOMオブジェクトのセットで、Oracle Databaseと通信するよう設計されたアプリケーションの開発を簡素化します。OO4Oは高いパフォーマンスのデータベース・アクセスを提供します。また、ADOなど他のODBCまたはOLE DBベースのコンポーネントからでは面倒で非効率となる、Oracle固有機能へのアクセスが容易になります。
次のオブジェクト・インタフェースの1つを使用すると、Oracle Objects for OLE (OO4O) APIを介して、永続LOBの全体、または永続LOBの初め、中、終わりの部分に対する変更ができます。
OraBlob:
データベース内のBLOBデータ型において操作を実行するためのメソッドを提供します。
OraClob:
データベース内のCLOBデータ型において操作を実行するためのメソッドを提供します。
OraBFile:
オペレーティング・システム・ファイル内に格納されているBFILEデータにおける操作を実行するためのメソッドを提供します。
注意: OracleBlobおよびOracleClobは非推奨となっており、現在は機能していません |
OO4Oの構文および詳細は、OO4Oオンライン・ヘルプを参照してください。Oracle Objects for OLE(OO4O)は、データベースに付属するWindowsベースの製品です。
関連項目: 『Oracle Objects for OLE開発者ガイド』 |
これらのインタフェースはLOBロケータをカプセル化するため、ユーザーは、ロケータではなく、提供されているメソッドおよびプロパティを使用して操作することで、状態情報を取得できます。
次の例に、OraBlobおよびOraBfileの使用方法を示します。
Dim OraDyn as OraDynaset, OraSound1 as OraBLOB, OraSoundClone as OraBlob, OraMyBfile as OraBFile OraConnection.BeginTrans set OraDyn = OraDb.CreateDynaset("select * from print_media order by product_id", ORADYN_DEFAULT) set OraSound1 = OraDyn.Fields("Sound").value set OraSoundClone = OraSound1 OraParameters.Add "id", 1,ORAPARAM_INPUT OraParameters.Add "mybfile", Empty,ORAPARAM_OUTPUT OraParameters("mybfile").ServerType = ORATYPE_BFILE OraDatabase.ExecuteSQL ("begin GetBFile(:id, :mybfile ") end") Set OraMyBFile = OraParameters("mybfile").value'Go to Next row
OraDyn.MoveNext OraDyn.Edit'Lets update OraSound1 data with that from the BFILE
OraSound1.CopyFromBFile OraMyBFile OraDyn.Update OraDyn.MoveNext'Go to Next row
OraDyn.Edit'Lets update OraSound1 by appending with LOB data from 1st row represented by
'OraSoundClone OraSound1.Append OraSoundClone OraDyn.Update OraConnection.CommitTrans
この例では、次のことを表しています。
OraSound1
: ダイナセット内のカレント行のロケータを表します。
OraSoundClone
: 最初の行にあるロケータを表します。
カレント行における変更(OraDyn.MoveNext
など)は、次のことを意味します。
OraSound1
: 2番目の行のロケータを表します。
OraSoundClone
: 最初の行にあるロケータを表します。OraDyn
行ナビゲーションにかかわらず、OraSoundClone
は最初の行のロケータのみを参照します。
OraMyBFile
: OraDatabase
.ExecuteSQL
を実行することによって、PL/SQLプロシージャを実行した結果として、PL/SQL OUTパラメータから取得されたロケータを参照します。
注意: SQLの実行によって取得されたLOBは、トランザクションの存続期間のみ有効です。このため、BEGINTRANSおよびCOMMITTRANSを使用して、トランザクションの存続期間を指定します。 |
Oracle Objects for OLE (OO4O)には、BLOB
、CLOB
、NCLOB
およびBFILE
に格納されたデータにアクセスするために使用するメソッドおよびプロパティが含まれます。
関連項目: サポートされているLOB操作用のAPIについては、次の章を参照してください。 |
関連項目: パラメータ、パラメータ・タイプ、戻り値およびサンプル・コードの詳細は、OO4Oオンライン・ヘルプを参照してください。Oracle Objects for OLE(OO4O)は、データベースに付属するWindowsベースの製品で、ドキュメントはなく、オンライン・ヘルプのみです。OO4Oオンライン・ヘルプはデータベース・インストレーションのアプリケーション開発サブメニューから使用可能です。 |
BLOB
、CLOB
、NCLOB
およびBFILE
を操作するOO4Oのメソッドとプロパティは、次のとおりです。
表13-35 OO4O: BLOB、CLOBおよびNCLOBの値を変更するメソッド
メソッド | 説明 |
---|---|
|
|
|
|
|
指定のオフセットから開始して、 指定のオフセットから開始して、 |
|
|
|
|
|
データをファイルから データをファイルから |
|
データを データを |
表13-38 OO4O: 永続LOBバッファリング・メソッド
メソッド | 説明 |
---|---|
|
|
|
|
|
|
表13-39 OO4O: LOBプロパティ
プロパティ | 説明 |
---|---|
|
LOBが |
|
読取り/書込みポーリング操作の合計を取得/設定します。 |
|
読取り/書込み操作のオフセットを取得/設定します。デフォルトでは1に設定されています。 |
|
ポーリングのステータスを戻します。可能な値は次のとおりです。
|
|
LOBデータの長さを戻します。 |
Java(JDBC)を使用して、LOBに対して次の作業を行うことができます。
一時LOBの作成と操作、および表への永続LOBとしての保存。「JDBC: 一時LOB API」を参照してください。
次のクラスを介してJDBC APIを使用すると、Javaにおける永続LOBの全体、初め、中または終わりの部分に対する変更ができます。
oracle
.sql
.BLOB
oracle
.sql
.CLOB
これらのクラスは、LOB変更用のメソッドがあるJDBC 3.0仕様に応じてjava.sql.Blob
およびjava.sql.Clob
インタフェースを実装します。これらには、LOB変更用のOracle固有のレガシー・メソッドも含まれます。これらのレガシー・メソッドは非推奨としてマークされています。
Oracle Databaseリリース11.1以降、JDKの最小サポート・バージョンはJDK5です。JDK5を使用するには、ojdbc5.jar
をCLASSPATH
内に配置します。JDK6を使用するには、ojdbc6.jar
をCLASSPATH
内に配置します。ojdbc5.jar
はJDBC 3.0仕様をサポートし、ojdbc6.jar
は、JDK6での新規仕様であるJDBC4.0仕様をサポートします。
表7-42で説明する、非推奨のOracle独自のAPIの使用を停止することをお薦めします。
表13-42 BLOBメソッドの対応関係
Oracle独自メソッド(非推奨) | JDBC 3.0標準メソッドによる置換 |
---|---|
putBytes(long pos, byte [ ] bytes) |
setBytes(long pos, byte[] bytes) |
putBytes(long pos, byte [ ] bytes, int length) |
setBytes(long pos, byte[] bytes, int offset, int len) |
getBinaryOutputStream(long pos) |
setBinaryStream(long pos) |
trim (long len) |
truncate(long len) |
表13-43 CLOBメソッドの対応関係
Oracle独自メソッド(非推奨) | JDBC 3.0標準メソッドによる置換 |
---|---|
putString(long pos, String str) |
setString(long pos, String str) |
利用不可 |
setString(long pos, String str, int offset, int len) |
getAsciiOutputStream(long pos) |
setAsciiStream(long pos) |
getCharacterOutputStream(long pos) |
setCharacterStream(long pos) |
trim (long len) |
truncate(long len) |
これらのクラスによって提供されていないすべてのLOB機能は、PL/SQL DBMS_LOB
パッケージへコールすることによってアクセスできます。この方法は、このマニュアルの例で繰り返し使用されています。
フェッチ中にLOBロケータと一緒にデータおよびメタデータ(長さおよびチャンク・サイズ)の一部をプリフェッチすると、サーバー・ラウンドトリップ数を削減できます。SELECT
解析、実行およびフェッチは1回のラウンドトリップで発生します。大きいLOB(プリフェッチ・サイズの5倍より大きい)では、ほとんど改善しません。
プリフェッチ・サイズを構成するには、oracle.jdbc.OracleConnection
に定数として定義されている接続プロパティoracle.jdbc.defaultLobPrefetchSize
を使用します。値-1を使用するとプリフェッチが無効になり、0を使用するとメタデータのみのプリフェッチが有効になり、0より大きい任意の値を指定すると、フェッチ操作時にロケータとともにプリフェッチされるBLOB
のバイト数およびCLOB
の文字数を表します。
oracle.jdbc.OracleStatement
で定義されるメソッドを使用すると、特定の文のプリフェッチ・サイズを変更できます。
void setLobPrefetchSize(int size) throws SQLException;
文レベルの設定は、接続レベルの設定を上書きします。この設定は、サイズがプリフェッチするバイト数(またはCLOB
の文字)を表す拡張defineColumnType
メソッドを使用して列レベルで上書きされます。指定可能な値は接続プロパティと同様です。タイプは、CLOB
列にOracleTypes.CLOB
およびBLOB
列にOracleTypes.BLOB
を設定する必要があります。値が-1未満の場合、このメソッドではSQLException
が発生します。文を補うには、oracle.jdbc.OracleStatement
内の次を使用できます。
int getLobPrefetchSize();
ゼロコピー入力/出力プロトコルを使用すると、SecureFilesのパフォーマンスを改善できます。これは、新しいNet NSデータ転送プロトコルをサポートしているネットワーク・クライアントでのみ使用できます。
LOBがSecureFilesかどうかを判別するには、次のメソッドを使用します。
public boolean isSecureFile() throws SQLException
SecureFilesの場合、TRUE
が戻ります。
このThin接続プロパティを使用すると、ゼロコピー入力/出力プロトコルを無効にできます(FALSE
に設定)。
oracle.net.useZeroCopyIO
Oracle Net Servicesでは、ローカル・バッファとの間でデータ転送のやりとりをしなくても、Oracle Net Servicesユーザーにより提供されるデータ・バッファを使用できるようになりました。ネットワーク・バッファ(NS層)は省略され、内部LOBバッファが直接ネットワークに書き込まれます。バッファの読取りも、同様です。
この機能を使用できるのは、新規NSデータ・パケットをサポートするネットワーク・クライアントのみです(これはNSハンドシェイク中にネゴシエーションされます)。Thinドライバは新規NSプロトコルをサポートしているため、サーバーはゼロコピー・プロトコルを使用できます。また、JavaNetによってゼロコピーIOメカニズムが上位層に公開されるため、Thinドライバ・コードではデータ・コピーは必要なくなります。
次の2つの方法で、前述のすべてのLOBを参照できます。
OracleResultSet
の列として
OraclePreparedStatement
のOUT
型PL/SQLパラメータとして
OracleResultSet
の一部としてBLOB
オブジェクトとCLOB
オブジェクトが取り出された場合、これらのオブジェクトは現在選択されている行のLOBロケータを表します。
移動操作(rset
.next
()など)によってカレント行が変更されても、取り出されたロケータは元のLOB行を参照したままです。
最新のカレント行のロケータを取り出すには、移動操作を行うたびに、インスタンスがBLOB
、CLOB
またはBFILE
のいずれであるかに応じて、OracleResultSet
上でgetBLOB()
、getCLOB()
またはgetBFILE()
をコールする必要があります。
LOBでのJDBCの使用に関するJDBC構文および詳細は、次のドキュメントを参照してください。
関連項目:
|
表13-45 JDBC: BLOB値の読取りまたはテストを行うoracle.sql.BLOBメソッド
メソッド | 説明 |
---|---|
|
指定されたオフセットから、バイトの配列としてLOBの内容を取得します。 |
|
LOB内の指定されたバイト配列を、指定されたオフセットで検索します。 |
|
指定された |
|
このLOBを別のLOBと比較します。LOBロケータを相互に比較します。 |
|
LOBの長さを戻します。 |
|
LOBのチャンク・サイズを戻します。 |
表13-48 JDBC: CLOB値の読取りまたはテストを行うoracle.sql.CLOBメソッド
メソッド | 説明 |
---|---|
|
LOBの部分文字列を文字列として戻します。 |
|
LOBのサブセットを文字配列に読み取ります。 |
|
指定された文字列をLOB内の指定されたオフセットから検索します。 |
|
指定された |
|
LOBの長さを戻します。 |
|
|
表13-49 JDBC: CLOBバッファリングのためのoracle.sql.CLOBメソッドおよびプロパティ
メソッド | 説明 |
---|---|
|
|
|
JDBC 3.0: この |
|
|
|
JDBC 3.0: この |
表13-50 JDBC: 外部LOB(BFILE)値の読取りまたはテストを行うoracle.sql.BFILEメソッド
メソッド | 説明 |
---|---|
|
|
|
|
|
指定されたオフセットから、LOB内の指定された |
|
指定されたオフセットから、 |
|
|
|
この |
|
この |
|
この |
|
|
|
この |
|
この |
Oracle Database JDBCドライバには、一時LOBを作成およびクローズするためのAPIが含まれます。これらのAPIによって、以前のリリースで使用していたDBMS_LOB
PL/SQLパッケージの次のプロシージャを使用する必要がなくなります。
DBMS_LOB.createTemporary()
DBMS_LOB.isTemporary()
DBMS_LOB.freeTemporary()
表13-52 JDBC: 一時BLOB API
メソッド | 説明 |
---|---|
|
一時 |
|
指定の |
|
現行の |
|
指定の一時 |
|
一時 |
表13-53 JDBC: 一時CLOB API
メソッド | 説明 |
---|---|
|
一時 |
|
指定の |
|
現行の |
|
指定の一時 |
|
一時 |
oracle.sql.CLOB
クラスは、標準JDBCのjava.sql.Clob
インタフェースをOracle JDBCドライバに実装したものです。表13-53は、oracle.sql.CLOB
で一時CLOBにアクセスするためのOracle拡張APIを示しています。
Oracle DatabaseのJDBCドライバには、明示的にLOBをオープンおよびクローズするためのAPIが含まれます。これらのAPIによって、以前のDBMS_LOB.open()
およびDBMS_LOB.close()
を使用する必要がなくなります。
oracle.sql.BLOB
クラスは、標準JDBCのjava.sql.BlobインタフェースをOracle JDBCドライバに実装したものです。表13-54は、oracle.sql.BLOB
でBLOBをオープンおよびクローズするためのOracle拡張APIを示しています。
表13-54 JDBC: BLOBのオープンおよびクローズ
メソッド | 説明 |
---|---|
|
|
|
|
|
|
JDBCアプリケーションは、oracle.sql.BLOB
クラスに定義されているOPENメソッドを使用してBLOB
をオープンできます。OPENメソッドの定義は次のとおりです。
/** * Open a BLOB in the indicated mode. Valid modes include MODE_READONLY, * and MODE_READWRITE. It is an error to open the same LOB twice. */ public void open (int mode) throws SQLException
MODEパラメータに指定可能な値は次のとおりです。
public static final int MODE_READONLY public static final int MODE_READWRITE
OPENをコールするたびにBLOBがオープンします。次に例を示します。
BLOB blob = ... blob.open (BLOB.MODE_READWRITE);
JDBCアプリケーションは、oracle.sql.BLOBに定義されているISOPEN
メソッドを使用して、BLOB
がオープンしているかどうかを確認できます。戻されたブール値は、以前にBLOB
がオープンされているかどうかを示します。isOpen
メソッドは次のように定義します。
/** * Check whether the BLOB is opened. * @return true if the LOB is opened. */ public boolean isOpen () throws SQLException
次に例を示します。
BLOB blob = ... // See if the BLOB is opened boolean isOpen = blob.isOpen ();
oracle.sql.CLOB
クラスは、標準JDBCのjava.sql.Clob
インタフェースをOracle JDBCドライバに実装したものです。表13-55は、oracle.sql.CLOB
でCLOB
をオープンおよびクローズするためのOracle拡張APIを示しています。
表13-55 JDBC: CLOBのオープンおよびクローズ
メソッド | 説明 |
---|---|
|
|
|
|
|
|
JDBCアプリケーションは、oracle.sql.CLOB
クラスに定義されているOPENメソッドを使用してCLOB
をオープンできます。OPENメソッドの定義は次のとおりです。
/** * Open a CLOB in the indicated mode. Valid modes include MODE_READONLY, * and MODE_READWRITE. It is an error to open the same LOB twice. */ public void open (int mode) throws SQLException
MODEパラメータに指定可能な値は次のとおりです。
public static final int MODE_READONLY public static final int MODE_READWRITE
OPENをコールするたびにCLOB
がオープンします。次に例を示します。
CLOB clob = ... clob.open (CLOB.MODE_READWRITE);
JDBCアプリケーションは、oracle.sql.CLOBに定義されているISOPEN
メソッドを使用して、CLOB
がオープンしているかどうかを確認できます。戻されたブール値は、以前にCLOB
がオープンされているかどうかを示します。isOpen
メソッドは次のように定義します。
/** * Check whether the CLOB is opened. * @return true if the LOB is opened. */ public boolean isOpen () throws SQLException
次に例を示します。
CLOB clob = ... // See if the CLOB is opened boolean isOpen = clob.isOpen ();
oracle.sql.BFILE
クラスは、データベースBFILE
オブジェクトをラップします。表13-56は、oracle.sql.BFILE
でBFILE
をオープンおよびクローズするOracle拡張APIを示しています。
表13-56 BFILEをオープンおよびクローズするためのJDBC拡張API
メソッド | 説明 |
---|---|
|
|
|
|
|
|
|
|
JDBCアプリケーションは、oracle.sql.BFILE
クラスに定義されているOPEN
メソッドを使用してBFILE
をオープンできます。OPENメソッドの定義は次のとおりです。
/** * Open a external LOB in the read-only mode. It is an error * to open the same LOB twice. */ public void open () throws SQLException /** * Open a external LOB in the indicated mode. Valid modes include * MODE_READONLY only. It is an error to open the same * LOB twice. */ public void open (int mode) throws SQLException
MODEパラメータに指定可能な値は次のとおりです。
public static final int MODE_READONLY
OPENをコールするたびにBFILE
がオープンします。次に例を示します。
BFILE bfile = ... bfile.open ();
JDBCアプリケーションでBFILE
がオープンしているかどうかを確認するには、oracle.sql.BFILE
で定義されているisOpen
メソッドを使用します。戻されたブール値は、以前にBFILEがオープンされているかどうかを示します。isOpen
メソッドは次のように定義します。
/** * Check whether the BFILE is opened. * @return true if the LOB is opened. */ public boolean isOpen () throws SQLException
次に例を示します。
BFILE bfile = ... // See if the BFILE is opened boolean isOpen = bfile.isOpen ();
JDBCアプリケーションは、oracle.sql.BFILE
に定義されているCLOSE
メソッドを使用してBFILE
をクローズできます。CLOSE
APIの定義は次のとおりです。
/** * Close a previously opened BFILE. */ public void close () throws SQLException
次に例を示します。
BFILE bfile = ... // close the BFILE bfile.close ();
/*
* This sample shows how to open/close BLOB and CLOB.
*/
// You must import the java.sql package to use JDBC
import java.sql.*;
// You must import the oracle.sql package to use oracle.sql.BLOB
import oracle.sql.*;
class OpenCloseLob
{
public static void main (String args [])
throws SQLException
{
// Load the Oracle JDBC driver
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
String url = "jdbc:oracle:oci8:@";
try {
String url1 = System.getProperty("JDBC_URL");
if (url1 != null)
url = url1;
} catch (Exception e) {
// If there is any security exception, ignore it
// and use the default
}
// Connect to the database
Connection conn =
DriverManager.getConnection (url, "scott", "password");
// It is faster when auto commit is off
conn.setAutoCommit (false);
// Create a Statement
Statement stmt = conn.createStatement ();
try
{
stmt.execute ("drop table basic_lob_table");
}
catch (SQLException e)
{
// An exception could be raised here if the table did not exist.
}
// Create a table containing a BLOB and a CLOB
stmt.execute ("create table basic_lob_table (x varchar2 (30), b blob, c clob)");
// Populate the table
stmt.execute (
"insert into basic_lob_table values"
+ " ('one', '010101010101010101010101010101', 'onetwothreefour')");
// Select the lobs
ResultSet rset = stmt.executeQuery ("select * from basic_lob_table");
while (rset.next ())
{
// Get the lobs
BLOB blob = (BLOB) rset.getObject (2);
CLOB clob = (CLOB) rset.getObject (3);
// Open the lobs
System.out.println ("Open the lobs");
blob.open (BLOB.MODE_READWRITE);
clob.open (CLOB.MODE_READWRITE);
// Check if the lobs are opened
System.out.println ("blob.isOpen()="+blob.isOpen());
System.out.println ("clob.isOpen()="+clob.isOpen());
// Close the lobs
System.out.println ("Close the lobs");
blob.close ();
clob.close ();
// Check if the lobs are opened
System.out.println ("blob.isOpen()="+blob.isOpen());
System.out.println ("clob.isOpen()="+clob.isOpen());
}
// Close the ResultSet
rset.close ();
// Close the Statement
stmt.close ();
// Close the connection
conn.close ();
}
}
Oracle DatabaseのJDBCドライバには、永続LOBを切り捨てるためのAPIが含まれています。これによって、以前のDBMS_LOB.trim()
を使用する必要がなくなります。
oracle.sql.BLOB
クラスは、標準JDBCのjava.sql.Blob
インタフェースをOracle JDBCドライバに実装したものです。表13-57は、oracle.sql.BLOB
でBLOBを切り捨てるためのOracle拡張APIを示しています。
TRUNCATE APIの定義は次のとおりです。
/** *Truncate the value of the BLOB to the length you specify in the newlen parameter. * @param newlen the new length of the BLOB. */ public void truncate (long newlen) throws SQLException
newlen
パラメータにBLOB
の新しい長さを指定します。
oracle.sql.CLOB
クラスは、標準JDBCのjava.sql.Clob
インタフェースをOracle JDBCドライバに実装したものです。表13-58は、oracle.sql.CLOB
でCLOB
を切り捨てるためのOracle拡張APIを示しています。
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
の新しい長さを指定します。
データベースに用意されているJDBCインタフェースには、要求された位置でJavaストリームからのLOBの読取りおよび書込みを行うためのLOBストリーミングAPIが含まれています。
oracle.sql.BLOB
クラスは、標準JDBCのjava.sql.Blob
インタフェースを実装したものです。表13-59は、BLOBストリーミングAPIを示しています。
表13-59 JDBC: BLOBストリーミングAPI
メソッド | 説明 |
---|---|
|
JDBC 3.0: この |
|
JDBC 3.0: この |
|
Oracle拡張機能: この |
これらのAPIの定義は次のとおりです。
/** * Write to the BLOB from a stream at the requested position. * * @param pos is the position data to be put. * @return a output stream to write data to the BLOB */ public java.io.OutputStream setBinaryStream(long pos) throws SQLException /** * Read from the BLOB as a stream at the requested position. * * @param pos is the position data to be read. * @return a output stream to write data to the BLOB */ public java.io.InputStream getBinaryStream(long pos) throws SQLException
oracle.sql.CLOB
クラスは、標準JDBCのjava.sql.Clob
インタフェースをOracle JDBCドライバに実装したものです。表13-60は、CLOB
ストリーミングAPIを示しています。
表13-60 JDBC: CLOBストリーミングAPI
メソッド | 説明 |
---|---|
|
JDBC 3.0: この |
|
JDBC 3.0: この |
|
JDBC 3.0: この |
|
Oracle拡張機能: この |
|
JDBC 3.0: この |
|
Oracle拡張機能: この |
これらのAPIの定義は次のとおりです。
/** * Write to the CLOB from a stream at the requested position. * @param pos is the position data to be put. * @return a output stream to write data to the CLOB */ public java.io.OutputStream setAsciiStream(long pos) throws SQLException /**
* Write to the CLOB from a stream at the requested position. * @param pos is the position data to be put. * @return a output stream to write data to the CLOB */ public java.io.Writer setCharacterStream(long pos) throws SQLException /** * Read from the CLOB as a stream at the requested position. * @param pos is the position data to be put. * @return a output stream to write data to the CLOB */ public java.io.InputStream getAsciiStream(long pos) throws SQLException /** * Read from the CLOB as a stream at the requested position. * @param pos is the position data to be put. * @return a output stream to write data to the CLOB */ public java.io.Reader getCharacterStream(long pos) throws SQLException
oracle.sql.BFILE
クラスは、データベースBFILE
をラップします。表13-61は、oracle.sql.BFILE
でBFILE
の内容を、要求された位置から読み取るOracle拡張APIを示しています。
表13-61 JDBC: BFILEストリーミングAPI
メソッド | 説明 |
---|---|
|
|
これらのAPIの定義は次のとおりです。
/** * Read from the BLOB as a stream at the requested position. * * @param pos is the position data to be read. * @return a output stream to write data to the BLOB */ public java.io.InputStream getBinaryStream(long pos) throws SQLException
/*
* This sample shows how to read/write BLOB and CLOB as streams.
*/
import java.io.*;
// You must import the java.sql package to use JDBC
import java.sql.*;
// You must import the oracle.sql package to use oracle.sql.BLOB
import oracle.sql.*;
class NewStreamLob
{
public static void main (String args []) throws Exception
{
// Load the Oracle JDBC driver
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
String url = "jdbc:oracle:oci8:@";
try {
String url1 = System.getProperty("JDBC_URL");
if (url1 != null)
url = url1;
} catch (Exception e) {
// If there is any security exception, ignore it
// and use the default
}
// Connect to the database
Connection conn =
DriverManager.getConnection (url, "scott", "password");
// It is faster when auto commit is off
conn.setAutoCommit (false);
// Create a Statement
Statement stmt = conn.createStatement ();
try
{
stmt.execute ("drop table basic_lob_table");
}
catch (SQLException e)
{
// An exception could be raised here if the table did not exist.
}
// Create a table containing a BLOB and a CLOB
stmt.execute (
"create table basic_lob_table"
+ "(x varchar2 (30), b blob, c clob)");
// Populate the table
stmt.execute (
"insert into basic_lob_table values"
+ "('one', '010101010101010101010101010101', 'onetwothreefour')");
System.out.println ("Dumping lobs");
// Select the lobs
ResultSet rset = stmt.executeQuery ("select * from basic_lob_table");
while (rset.next ())
{
// Get the lobs
BLOB blob = (BLOB) rset.getObject (2);
CLOB clob = (CLOB) rset.getObject (3);
// Print the lob contents
dumpBlob (conn, blob, 1);
dumpClob (conn, clob, 1);
// Change the lob contents
fillClob (conn, clob, 11, 50);
fillBlob (conn, blob, 11, 50);
}
rset.close ();
System.out.println ("Dumping lobs again");
rset = stmt.executeQuery ("select * from basic_lob_table");
while (rset.next ())
{
// Get the lobs
BLOB blob = (BLOB) rset.getObject (2);
CLOB clob = (CLOB) rset.getObject (3);
// Print the lobs contents
dumpBlob (conn, blob, 11);
dumpClob (conn, clob, 11);
}
// Close all resources
rset.close();
stmt.close();
conn.close();
}
// Utility function to dump Clob contents
static void dumpClob (Connection conn, CLOB clob, long offset)
throws Exception
{
// get character stream to retrieve clob data
Reader instream = clob.getCharacterStream(offset);
// create temporary buffer for read
char[] buffer = new char[10];
// length of characters read
int length = 0;
// fetch data
while ((length = instream.read(buffer)) != -1)
{
System.out.print("Read " + length + " chars: ");
for (int i=0; i<length; i++)
System.out.print(buffer[i]);
System.out.println();
}
// Close input stream
instream.close();
}
// Utility function to dump Blob contents
static void dumpBlob (Connection conn, BLOB blob, long offset)
throws Exception
{
// Get binary output stream to retrieve blob data
InputStream instream = blob.getBinaryStream(offset);
// Create temporary buffer for read
byte[] buffer = new byte[10];
// length of bytes read
int length = 0;
// Fetch data
while ((length = instream.read(buffer)) != -1)
{
System.out.print("Read " + length + " bytes: ");
for (int i=0; i<length; i++)
System.out.print(buffer[i]+" ");
System.out.println();
}
// Close input stream
instream.close();
}
// Utility function to put data in a Clob
static void fillClob (Connection conn, CLOB clob, long offset, long length)
throws Exception
{
Writer outstream = clob.setCharacterStream(offset);
int i = 0;
int chunk = 10;
while (i < length)
{
outstream.write("aaaaaaaaaa", 0, chunk);
i += chunk;
if (length - i < chunk)
chunk = (int) length - i;
}
outstream.close();
}
// Utility function to put data in a Blob
static void fillBlob (Connection conn, BLOB blob, long offset, long length)
throws Exception
{
OutputStream outstream = blob.setBinaryStream(offset);
int i = 0;
int chunk = 10;
byte [] data = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
while (i < length)
{
outstream.write(data, 0, chunk);
i += chunk;
if (length - i < chunk)
chunk = (int) length - i;
}
outstream.close();
}
}
oracle.sql.BLOB
にある次のAPIを使用すると、空のBLOB
を作成できます。
public static BLOB empty_lob () throws SQLException
同様に、oracle.sql.CLOB
にある次のAPIを使用すると、空のCLOB
を作成できます。
public static CLOB empty_lob () throws SQLException
JDBCドライバを使用すると、データベースをラウンドトリップさせることなく、空のLOBインスタンスを作成できます。空のLOBは、次の場合に使用できます。
PreparedStatementの「設定」API
更新可能な結果セットの「更新」API
STRUCTの属性値
ARRAYの要素値
注意: 空のLOBは特別なマーカーとしてのLOBであり、実際のLOB値ではありません。 |
JDBCアプリケーションでは、前述のAPIから作成された空のLOBに対する読取りまたは書込みを実行できません。アプリケーションが空のLOBに対する読取りまたは書込みを実行しようとすると、ORA-17098「空のLOBに対する操作は無効です」が表示されます。
OraOLEDBは、OLE DBおよびADOの開発者に高いパフォーマンス、およびOracleデータへの効率的なアクセスを提供します。COM、C++または任意のCOMクライアントを使用してプログラムを作成する開発者は、OraOLEDBを使用してOracleデータベースにアクセスできます。
OraOLEDBは、OracleのためのOLE DBプロバイダです。これは、高いパフォーマンス、およびLOBなどのOracleデータへの効率的なアクセスを提供します。また、これを使用して特定のLOB型に更新することもできます。
OraOLEDBは、次のLOB型をサポートします。
永続LOBの場合。行セット全体でのREAD/WRITE。
BFILEの場合。行セット全体での読取り専用
一時LOBは行セット全体ではサポートされません。
関連項目: 『Oracle Provider for OLE DB開発者ガイド』 |
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 Framworkを使用することを開発者に薦めています。
関連項目: 『Oracle Data Provider for .NET開発者ガイド』 |