ヘッダーをスキップ
Oracle® Database SecureFilesおよびラージ・オブジェクト開発者ガイド
11gリリース2 (11.2)
B56263-04
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

22 LOB APIの使用

この章では、BLOBCLOBおよびNCLOBデータ型の操作を実行するAPIについて説明します。この章で説明する操作は、永続LOBインスタンスまたは一時LOBインスタンスに使用できます。BFILEには適用されないことに注意してください。この章で説明するAPIのリストは、表22-1を参照してください。


関連項目:


この章では、操作ごとに次の項目について説明します。

この章の内容は次のとおりです。

サポートされている環境

表22-1「LOB APIについてサポートされている環境」に、この章で説明するAPIについてサポートされているプログラム環境を示します。第1列は、APIで実行される操作を示します。その他の列は、そのAPIがPL/SQL、OCI、OCCI、COBOL、Pro*C/C++、COMおよびJDBCでサポートされているかどうかに応じて、「はい」または「いいえ」となっています。

表22-1 LOB APIについてサポートされている環境

操作 PL/SQL OCI OCCI COBOL Pro*C/C++ COM JDBC

他のLOBへのLOBの追加

はい

はい

いいえ

はい

はい

はい

はい

キャラクタ・セット・フォームの取得

いいえ

はい

いいえ

いいえ

いいえ

いいえ

いいえ

キャラクタ・セットIDの取得

いいえ

はい

いいえ

いいえ

いいえ

いいえ

いいえ

チャンク・サイズの決定、関連項目: 「LOBへのデータの書込み」

はい

はい

はい

はい

はい

はい

はい

2つのLOBの全体または一部の比較

はい

いいえ

いいえ

はい

はい

はい

はい

BLOBからCLOBへの変換

はい

いいえ

いいえ

いいえ

いいえ

いいえ

いいえ

CLOBからBLOBへの変換

はい

いいえ

いいえ

いいえ

いいえ

いいえ

いいえ

LOBロケータのコピー

はい

はい

いいえ

はい

はい

はい

はい

他のLOBへのLOBの全体または一部のコピー

はい

はい

いいえ

はい

はい

はい

はい

LOBバッファリングの使用禁止化

いいえ

はい

いいえ

はい

はい

はい

いいえ

LOBデータの表示

はい

はい

いいえ

はい

はい

はい

はい

LOBバッファリングの使用可能化

いいえ

いいえ

いいえ

はい

はい

はい

いいえ

等値: 2つのLOBロケータが等しいかどうかの確認

いいえ

はい

いいえ

いいえ

はい

いいえ

はい

LOBの一部の消去

はい

はい

いいえ

はい

はい

はい

はい

バッファのフラッシュ

いいえ

はい

いいえ

はい

はい

いいえ

いいえ

LOBロケータが初期化されているかどうかの確認

いいえ

はい

いいえ

いいえ

はい

いいえ

いいえ

長さ: LOBの長さの取得

はい

はい

いいえ

はい

はい

はい

はい

LOBへのBFILEデータのロード

はい

はい

いいえ

はい

はい

はい

はい

BLOBへのBFILEデータのロード

はい

いいえ

いいえ

いいえ

いいえ

いいえ

いいえ

CLOBまたはNCLOBへのBFILEデータのロード

はい

いいえ

いいえ

いいえ

いいえ

いいえ

いいえ

LOB配列読取り


いいえ

はい

いいえ

いいえ

いいえ

いいえ

いいえ

LOB配列書込み


いいえ

はい

いいえ

いいえ

いいえ

いいえ

いいえ

OPENおよびCLOSEインタフェースを使用した永続LOBのオープン


はい

はい

はい

はい

はい

はい

はい

オープン: LOBがオープンしているかどうかの確認

はい

はい

はい

はい

はい

はい

はい

パターン: INSTRを使用したLOB内のパターンの有無の確認

はい

いいえ

いいえ

はい

はい

いいえ

はい

LOBの一部の読取り(SUBSTR)

はい

いいえ

いいえ

はい

はい

はい

はい

LOBからのデータの読取り

はい

はい

いいえ

はい

はい

はい

はい

記憶域の制限、決定: サイズがTBのLOBの最大記憶域の制限

はい

いいえ

いいえ

いいえ

いいえ

いいえ

いいえ

LOBデータの切捨て

はい

はい

いいえ

はい

はい

はい

はい

WriteNoAppend、関連項目: 「LOBへの追加」

いいえ

いいえ

いいえ

いいえ

いいえ

いいえ

いいえ

LOBへのデータの書込み

はい

はい

はい

はい

はい

はい

はい


他のLOBへのLOBの追加

この操作では、あるLOBインスタンスを他のLOBインスタンスに追加します。

事前条件

LOBを他のLOBに追加する前に、次の条件を満たしている必要があります。

  • 2つのLOBインスタンスが存在していること。

  • 両方のインスタンスが同じ型であること(両方ともBLOB型、または両方ともCLOB型など)。

  • この操作には、永続LOBインスタンスまたは一時LOBインスタンスの任意の組合せを渡すことができます。

使用上の注意

永続LOB: PL/SQLのDBMS_LOBパッケージまたはOCIを使用する場合は、LOB値を更新する前にLOBを選択する行をロックする必要があります。SQL INSERT文およびUPDATE文は暗黙的に行をロックしますが、SQLプログラムおよびPL/SQLプログラムではSQL SELECT FOR UPDATE文を使用して、またOCIプログラムではOCI pinまたはlock関数を使用して明示的にロックできます。更新後のロケータの状態の詳細は、「更新済ロケータを介したLOBの更新の例」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」のAPPENDに関する項

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobAppend()」

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB APPEND」

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「埋込みSQL文およびディレクティブ」の「LOB APPEND」

  • COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

  • Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』のJavaにおけるLOB列の作成と移入

次の例を実行するには、2つのLOBインスタンスを作成し、それを指定のAPPEND操作のコール時に渡す必要があります。LOBインスタンスの作成方法は、第19章「永続LOBに固有の操作と一時LOBに固有の操作」を参照してください。

ここに示す例は、次のプログラム環境での例です。

  • PL/SQL(DBMS_LOBパッケージ): lappend.sql

  • OCI: lappend.c

  • COM(OO4O): lappend.bas

  • Java(JDBC): lappend.java

キャラクタ・セット・フォームの取得

この項では、LOBインスタンスのキャラクタ・セット・フォームを取得する方法について説明します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 参照マニュアルはありません。

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobCharSetForm()」

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 参照マニュアルはありません。

  • C/C++(Pro*C/C++): 参照マニュアルはありません。

  • COM(OO4O): 参照マニュアルはありません。

  • Java(JDBC): 参照マニュアルはありません。

次の例では、外国語のテキスト(ad_fltextn)のキャラクタ・セット・フォームを取得する方法について説明します。

この機能はOCIでのみ使用可能です。

  • OCI: lgetchfm.c

キャラクタ・セットIDの取得

この項では、キャラクタ・セットIDを取得する方法について説明します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 参照マニュアルはありません。

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「その他のOCIリレーショナル関数」の「LOB関数」の「OCILobCharSetId()」

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 参照マニュアルはありません。

  • C/C++(Pro*C/C++): 参照マニュアルはありません。

  • COM(OO4O): 参照マニュアルはありません。

  • Java(JDBC): 参照マニュアルはありません。

この機能はOCIでのみ使用可能です。

  • OCI: lgetchar.c

LOBへのBFILEデータのロード

この操作では、LOBにBFILEデータをロードします。このプロシージャを使用すると、任意のLOBデータ型である永続LOBインスタンスまたは一時LOBインスタンスにデータをロードできます。


関連項目:

  • LOADBLOBFROMFILEおよびLOADCLOBFROMFILEプロシージャによって、このプロシージャの機能が実装されるため、バイナリ・データおよび文字データのロード機能が向上します。(改善されたプロシージャは、PL/SQL環境のみで使用可能です。)可能なかぎり、機能が向上したプロシージャを使用することをお薦めします。詳細は、「BLOBへのBFILEデータのロード」および「CLOBまたはNCLOBへのBFILEデータのロード」を参照してください。

  • この操作のかわりに、SQL*Loaderを使用して永続LOBのデータをファイルシステム内のファイルから直接ロードすることもできます。詳細は、「SQL*Loaderを使用したLOBのロード」を参照してください。


事前条件

BFILEデータをLOBにロードする前に、次の条件を満たしている必要があります。

  • BFILEが存在すること。

  • ターゲットのLOBインスタンスが存在すること。

使用上の注意

この操作については、次の注意事項があります。

文字データのロード時のLOADCLOBFROMFILEの使用

DBMS_LOB.LOADFROMFILEプロシージャを使用してCLOBまたはNCLOBインスタンスにロードする場合は、BFILEからバイナリ・データを使用してLOBをロードすることになり、暗黙的なキャラクタ・セット変換は実行されません。そのため、文字データをロードするときにはDBMS_LOB.LOADCLOBFROMFILEプロシージャの使用が推奨されます。詳細は、「CLOBまたはNCLOBへのBFILEデータのロード」を参照してください。

BFILEデータのロード量の指定

表22-2に示すファンクションの量パラメータでは、次のいずれかの値を渡す必要があります。

  • ロードするBFILEの実際のサイズ(バイト単位)以下の量。

  • 最大許容LOBサイズ(バイトで表されます)。この値を渡すと、BFILE全体がロードされます。この方法を使用すると、ロード前にBFILEのサイズを確認せずにBFILE全体をロードできます。最大許容LOBサイズを取得するには、表22-2に示す方法を使用します。

表22-2 ファイルからのロード操作用の最大LOBサイズ

環境 ファンクション 最大LOBサイズを渡すために取得する値

DBMS_LOB

DBMS_LOB.LOADBLOBFROMFILE

DBMS_LOB.LOBMAXSIZE

DBMS_LOB

DBMS_LOB.LOADCLOBFROMFILE

DBMS_LOB.LOBMAXSIZE

OCI

OCILobLoadFromFile2()

(LOBのサイズが任意の場合)

UB8MAXVAL

OCI

OCILobLoadFromFile()

(LOBのサイズが4GB未満の場合)

UB4MAXVAL


構文

各プログラム環境でこの操作を使用する方法の詳細は、次のマニュアルを参照してください。

  • PL/SQL (DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」のLOADFROMFILEに関する項

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobLoadFromFile()」

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB LOAD」、「LOB OPEN」、「LOB CLOSE

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB LOAD

  • COM(OO4O) 『Oracle Objects for OLE開発者ガイド』

  • Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): lloaddat.sql

  • OCI: lloaddat.c

  • COM(OO4O): lloaddat.bas

  • Java(JDBC): lloaddat.java

BLOBへのBFILEデータのロード

このプロシージャでは、BLOBBFILEデータをロードします。このプロシージャを使用すると、任意の永続または一時BLOBインスタンスにデータをロードできます。


関連項目:


事前条件

このプロシージャをコールする前に、次の条件を満たしている必要があります。

  • ターゲットのBLOBインスタンスが存在すること。

  • ソースBFILEが存在すること。

  • BFILEをオープンしていること。(このプロシージャをコールした後、いずれかの時点でBFILEをクローズする必要があります。)

使用上の注意

この操作では、次のことに注意してください。

戻される新規オフセット

DBMS_LOB.LOADBLOBFROMFILEを使用してBLOBにバイナリ・データをロードすると、DBMS_LOB.LOADFROMFILEを使用した場合と同じ結果になりますが、BLOBの新規オフセットも戻されます。

BFILEデータのロード量の指定

DBMS_LOB.LOADBLOBFROMFILEファンクションの量パラメータでは、次のいずれかの値を渡す必要があります。

  • ロードするBFILEの実際のサイズ(バイト単位)以下の量。

  • 許容される最大LOBサイズはDBMS_LOB.LOBMAXSIZEです。この値を渡すと、ファンクションによってBFILE全体がロードされます。この方法は、BFILEのサイズをイントロスペクトせずにBFILE全体をロードする場合に役立ちます。

構文

このプロシージャの構文の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「LOADBLOBFROMFILEプロシージャ」を参照してください。

この例はPL/SQLでのみ使用可能です。他のプログラム環境では、このAPIは提供されません。オンライン・ファイルはlldblobf.sqlです。この例は次の使用方法を示します。

  • LOADBLOBFROMFILEを使用して、最初にBFILEの長さを取得することなくファイル全体をロードする方法

  • オフセットの戻り値を使用して、実際にロードされたデータ量を計算する方法

CLOBまたはNCLOBへのBFILEデータのロード

このプロシージャでは、CLOBまたはNCLOBBFILE文字データをロードします。このプロシージャを使用すると、任意の永続または一時CLOBまたはNCLOBインスタンスにデータをロードできます。


関連項目:


事前条件

このプロシージャをコールする前に、次の条件を満たしている必要があります。

  • ターゲットのCLOBまたはNCLOBインスタンスが存在すること。

  • ソースBFILEが存在すること。

  • BFILEをオープンしていること。(このプロシージャをコールした後、いずれかの時点でBFILEをクローズする必要があります。)

使用上の注意

このプロシージャのコール時に、BFILEのキャラクタ・セットIDを指定できます。これにより、BFILEデータのキャラクタ・セットが宛先のCLOBまたはNCLOBキャラクタ・セットに正しく変換されることが保証されます。

BFILEデータのロード量の指定

DBMS_LOB.LOADCLOBFROMFILEファンクションの量パラメータでは、次のいずれかの値を渡す必要があります。

  • ロードするBFILEデータの実際のサイズ(文字単位)以下の量

  • 最大許容LOBサイズ: DBMS_LOB.LOBMAXSIZE

    この値を渡すと、ファンクションによりBFILE全体がロードされます。この方法は、BFILEのサイズをイントロスペクトせずにBFILE全体をロードする場合に役立ちます。

構文

このプロシージャの構文の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「LOADCLOBFROMFILEプロシージャ」を参照してください。

次の例に、このAPIの様々な使用方法を示します。

PL/SQL: BFILEからLOBへの文字データのロード

次の項目の例を示します。

  • デフォルトCSID(0)の使用方法

  • BFILEに対してgetlengthをコールせずに、ファイル全体をロードする方法

  • 戻されたオフセット値を使用して、実際にロードしたデータ量を計算する方法

この例では、ad_sourceUTF8キャラクタ・セット・フォーマットのBFILEで、データベースのキャラクタ・セットがUTF8であることを想定しています。オンライン・ファイルはlldclobf.sqlです。

PL/SQL: 異なるLOBへの文字データ・セグメントのロード

次の項目の例を示します。

  • NLS_CHARSET_IDファンクションを使用して、キャラクタ・セット名からキャラクタ・セットIDを取得する方法

  • 戻されたオフセット値および言語コンテキストlang_ctxを使用して、1つのBFILEから複数のLOBにストリームのデータをロードする方法

  • 警告メッセージの読取り方法

この例では、ad_file_ext_01JA16TSTSETフォーマットのBFILEで、データベースの各国語キャラクタ・セットがAL16UTF16であることを想定しています。オンライン・ファイルはlldclobs.sqlです。

LOBがオープンしているかどうかの確認

この操作では、LOBがオープンしているかどうかを確認します。

事前条件

このプロシージャを実行する前に、LOBインスタンスが存在する必要があります。

使用上の注意

LOBがオープンしている場合は、セッション中のいずれかの時点でクローズする必要があります。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」のOPEN」、「ISOPEN

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobIsOpen()

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB DESCRIBE」

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」のLOB DESCRIBE ... ISOPEN ...に関する項

  • COM(OO4O): 参照マニュアルはありません。

  • Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): lisopen.sql

  • OCI: lisopen.c

  • C++(OCCI): 今回のリリースでは例は提供されません。

  • COM(OO4O): 今回のリリースでは例は提供されません。

  • Java (JDBC): lisopen.java

Java(JDBC): LOBがオープンしているかどうかの確認

次に、BLOBまたはCLOBの確認方法を示します。

CLOBがオープンしているかどうかの確認

JDBCアプリケーションでCLOBがオープンしているかどうかを確認するには、oracle.sql.CLOBで定義されているisOpenメソッドを使用します。戻されたブール値は、以前に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 ();
...

BLOBがオープンしているかどうかの確認

JDBCアプリケーションでBLOBがオープンしているかどうかを確認するには、oracle.sql.BLOBで定義されているisOpenメソッドを使用します。戻されたブール値は、以前に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 ();
...

LOBデータの表示

この項では、LOBデータの読取りに使用できるAPIについて説明します。この操作を使用してLOBデータをバッファに読み取ることができます。この操作は、アプリケーションで大量のLOBデータを表示したり、データ・ストリーム操作が必要な場合に役立ちます。

使用上の注意

これらのAPIを使用する場合は、次のことに注意してください。

ストリーム・メカニズム

大量のLOBデータを最も効率よく読み取るには、ストリーム・メカニズムを有効にしたOCILobRead2()を使用します。

量パラメータ

表22-3に示すAPIの場合、量パラメータに渡す値には制限があります。

表22-3 量パラメータの最大LOBサイズ

環境 ファンクション 量パラメータの値の制限

DBMS_LOB

DBMS_LOB.READ

32KBのバッファ・サイズ。

OCI

OCILobRead()

(LOBのサイズが4GB未満の場合)

UB4MAXVAL

この量を指定するとファイル全体が読み取られます。

OCI

OCILobRead2()

(LOBのサイズが任意の場合)

UB8MAXVAL

この量を指定するとファイル全体が読み取られます。


構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「OPEN」、「READ」、「CLOSE」

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobOpen()」、「OCILobRead2()」、「OCILobClose()」

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB READ」

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB READ

  • COM(OO4O) (Oracle Objects for OLE (OO4O) 『Oracle Objects for OLE開発者ガイド』

  • Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): ldisplay.sql

  • OCI: ldisplay.c

  • C++(OCCI): 今回のリリースでは例は提供されません。

  • COM(OO4O): ldisplay.bas

  • Java(JDBC): ldisplay.java

LOBからのデータの読取り

この項では、OCILobRead2()を使用してLOBからデータを読み取る方法について説明します。

使用上の注意

この操作を使用する場合は、次のことに注意してください。

OCIでのストリーム読取り

大量のLOBデータを最も効率よく読み取るには、ポーリングまたはコールバックによってストリーム・メカニズムを有効にしたOCILobRead2()を使用します。そのためには、次のようにoffsetパラメータを使用して読取り開始位置を指定します。

ub8  char_amt =  0;
ub8  byte_amt =  0;
ub4  offset = 1000;

OCILobRead2(svchp, errhp, locp, &byte_amt, &char_amt, offset, bufp, bufl,
            OCI_ONE_PIECE, 0, 0, 0, 0);

ポーリング・モードを使用すると、バッファがいっぱいにならない場合があるため、各OCILobRead2()コール後にbyte_amtパラメータの値を調べて、バッファに何バイト読み取られたかを確認してください。

コールバックを使用すると、コールバックへの入力であるlenpパラメータにバッファに格納されたバイト数が示されます。バッファの空き領域を確認するために、コールバック処理時にはlenpパラメータを必ずチェックしてください(『Oracle Call Interfaceプログラマーズ・ガイド』を参照)。

チャンク・サイズ

チャンクとは1つまたは複数のOracleブロックです。LOBを含む表を作成する場合に、BasicFiles LOB用のチャンク・サイズを指定できます。これは、LOB値に対してアクセスまたは変更を行うときに、Oracle Databaseが使用するデータ・サイズに対応します。チャンクの一部はシステム関連の情報を格納し、残りはLOB値を格納します。使用するAPIには、LOBチャンク内で使用され、LOB値を格納している領域の量を戻すファンクションがあります。PL/SQLでは、DBMS_LOB.GETCHUNKSIZEを使用します。OCIでは、OCILobGetChunkSize()を使用します。SecureFilesでは、CHUNKは、アドバイザ・サイズで、後方互換性のために使用します。

パフォーマンスを改善するには、これらのファンクションの1つによって戻された値を複数回使用してwrite要求を実行します。これは、ディスクからのデータの読取り時に、Oracleデータベースで使用されているサイズと同じ単位を使用するためです。アプリケーションで問題が発生しないかぎり、同じLOBチャンクに複数回のLOB読取りコールを発行するのではなく、チャンク全体の取得に十分なサイズでバッチ読取りを行うと、パフォーマンスが向上します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」のOPENGETCHUNKSIZEREADCLOSEに関する項

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobOpen()」、「OCILobRead2()」、「OCILobClose()

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB READ

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB READ」

  • COM(OO4O) 『Oracle Objects for OLE開発者ガイド』

  • Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): lread.sql

  • OCI: lread.c

  • COM(OO4O): lread.bas

  • Java(JDBC): lread.java

LOB配列読取り

この項では、OCILobArrayRead()を使用して、1回のラウンドトリップで複数のロケータに対してLOBデータを読み取る方法について説明します。

使用上の注意

このファンクションを使用すると、サイズ範囲が512KB未満のLOBを読み取る場合のパフォーマンスが向上します。OCIアプリケーションの例では、プログラムに次のようなSQL文が用意されているものとします。

SELECT lob1 FROM lob_table for UPDATE;

lob1はLOB列であり、lob_arrayはLOB列に対応する定義変数の配列です。

OCILobLocator * lob_array[10];

...
 for (i=0; i<10, i++)        /* initialize array of locators */
    lob_array[i] = OCIDescriptorAlloc(..., OCI_DTYPE_LOB, ...);
 
...
 
OCIDefineByPos(..., 1, (dvoid *) lob_array, ... SQLT_CLOB, ...);
 
/* Execute the statement with iters = 10 to do an array fetch of 10 locators. */
OCIStmtExecute ( <service context>, <statement handle>, <error handle>,
                 10,    /* iters  */ 
                 0,     /* row offset */
                 NULL,  /* snapshot IN */
                 NULL,  /* snapshot out */
                 OCI_DEFAULT /* mode */);
...
 
  ub4 array_iter = 10;
  char  *bufp[10];
  oraub8 bufl[10];
  oraub8 char_amtp[10];
  oraub8 offset[10];  
 
 for (i=0; i<10; i++)
  {
    bufp[i] = (char *)malloc(1000);
    bufl[i] = 1000;
    offset[i] = 1;
    char_amtp[i] = 1000;  /* Single byte fixed width char set. */
  } 
 
/* Read the 1st 1000 characters for all 10 locators in one
 * round trip. Note that offset and amount need not be 
 * same for all the locators. */
 
OCILobArrayRead(<service context>, <error handle>,
                &array_iter, /* array size */
                lob_array,   /* array of locators */
                NULL,        /* array of byte amounts */
                char_amtp,   /* array of char amounts */
                offset,      /* array of offsets */
       (void **)bufp,        /* array of read buffers */
                bufl,        /* array of buffer lengths */
                OCI_ONE_PIECE,  /* piece information */
                NULL,           /* callback context */
                NULL,           /* callback function */
                0,              /* character set ID - default */
                SQLCS_IMPLICIT);/* character set form */
 
 ...
 
for (i=0; i<10; i++)
  {
    /* Fill bufp[i] buffers with data to be written */
    strncpy (bufp[i], "Test Data------", 15);
    bufl[i] = 1000;
    offset[i] = 50;
    char_amtp[i] = 15;  /* Single byte fixed width char set. */
  } 
 
/* Write the 15 characters from offset 50 to all 10 
 * locators in one round trip. Note that offset and
 * amount need not be same for all the locators. */
 */
 
OCILobArrayWrite(<service context>, <error handle>,
                  &array_iter, /* array size */
                  lob_array,   /* array of locators */
                  NULL,        /* array of byte amounts */
                  char_amtp,   /* array of char amounts */
                  offset,      /* array of offsets */
             (void **)bufp,    /* array of read buffers */
                  bufl,        /* array of buffer lengths */
                  OCI_ONE_PIECE,  /* piece information */
                  NULL,           /* callback context */
                  NULL,           /* callback function */
                  0,              /* character set ID - default */
                  SQLCS_IMPLICIT);/* character set form */
...

ストリーミングのサポート

LOB配列APIは、複数ピースでのLOBデータの読取り/書込みに使用できます。これには、ポーリング手法やコールバック・ファンクションを使用します。これにより、ロケータの配列について複数ピースで順に読取り/書込みが実行されます。ポーリングの場合、各ピースの読取り/書込みの後、array_iterパラメータ(OUT)でそのデータ読取り/書込み時のロケータの索引が示されると、APIがアプリケーションに戻ります。コールバックの場合、array_iterをINパラメータとして各ピースの読取り/書込みを実行すると、ファンクションがコールされます。

注意:

  • いくつかのロケータについては1つのピースでデータを読取り/書込みし、その他のロケータについては複数ピースでデータを読取り/書込みすることが可能です。読取り/書込み対象データの全体が収まるだけの十分なバッファ長を持つロケータについては、データは1つのピースで読取り/書込みされます。

  • アプリケーションでは、ロケータごとに異なる量の値およびバッファ長を使用できます。

  • アプリケーションでは、1つ以上のロケータに対して量の値としてゼロを渡し、これらのロケータに対して純粋なストリーミングを指定できます。読取りの場合、LOBデータはこれらのロケータに対して最後まで読み取られます。書込みの場合、これらのロケータに対してOCI_LAST_PIECEが指定されるまでデータが書き込まれます。

ポーリング・モードでのLOB配列読取り

次の例では、バッファ・サイズが1KBの10個のロケータのそれぞれに対して、10KBのデータが読み取られます。完全なデータを読み取るには、ロケータごとに10ピースが必要です。すべてのデータをフェッチするには、OCILobArrayRead()を100 (10*10)回コールする必要があります。まず、OCI_FIRST_PIECEpieceパラメータとしてOCILobArrayRead()をコールします。このコールで、最初のロケータに対して最初の1Kピースが戻されます。次に、アプリケーションでロケータに対するすべてのピースの読取りが終了し、OCI_SUCCESSが戻されるまでOCILobArrayRead()がループでコールされ、ます。この例では、99回ループしてロケータのピースを順次戻しています。

/* Fetch the locators */ 
...
 
     /* array_iter parameter indicates the number of locators in the array read.
      * It is an IN parameter for the 1st call in polling and is ignored as IN
      * parameter for subsequent calls. As OUT parameter it indicates the locator
      * index for which the piece is read.
      */
 
     ub4    array_iter = 10;
     char  *bufp[10];
     oraub8 bufl[10];
     oraub8 char_amtp[10];
     oraub8 offset[10];
     sword  st;  
 
     for (i=0; i<10; i++)
     {
       bufp[i] = (char *)malloc(1000);
       bufl[i] = 1000;
       offset[i] = 1;
       char_amtp[i] = 10000;       /* Single byte fixed width char set. */
     } 
 
     st =  OCILobArrayRead(<service context>, <error handle>,
                         &array_iter, /* array size */
                         lob_array, /* array of locators */
                         NULL,      /* array of byte amounts */
                         char_amtp, /* array of char amounts */
                         offset,    /* array of offsets */
                (void **)bufp,      /* array of read buffers */
                         bufl,      /* array of buffer lengths */
                         OCI_FIRST_PIECE, /* piece information */
                         NULL,           /* callback context */
                         NULL,           /* callback function */
                         0,              /* character set ID - default */
                         SQLCS_IMPLICIT); /* character set form */
 
     /* First piece for the first locator is read here. 
      * bufp[0]          => Buffer pointer into which data is read.
      * char_amtp[0 ]    => Number of characters read in current buffer
      *
      */ 
 
     While ( st == OCI_NEED_DATA)
     {  
          st =  OCILobArrayRead(<service context>, <error handle>,
                          &array_iter, /* array size */
                          lob_array, /* array of locators */
                          NULL,      /* array of byte amounts */
                          char_amtp, /* array of char amounts */
                          offset,    /* array of offsets */
                 (void **)bufp,      /* array of read buffers */
                          bufl,      /* array of buffer lengths */
                          OCI_NEXT_PIECE, /* piece information */
                          NULL,           /* callback context */
                          NULL,           /* callback function */
                          0,              /* character set ID - default */
                          SQLCS_IMPLICIT);
 
       /* array_iter returns the index of the current array element for which 
        * data is read. for example, aray_iter = 1 implies first locator,
        * array_iter = 2 implies second locator and so on.
        *
        * lob_array[ array_iter - 1]=> Lob locator for which data is read. 
        * bufp[array_iter - 1]      => Buffer pointer into which data is read.
        * char_amtp[array_iter - 1] => Number of characters read in current buffer
        */
 
...
        /* Consume the data here */
...
     }

コールバックによるLOB配列読取り

次の例では、バッファ・サイズが1KBの10個のロケータのそれぞれに対して、10KBのデータが読み取られます。各ロケータには、すべてのデータを読み取るために10ピースが必要です。コールバック関数またはファンクションは100(10 × 10)回コールされ、ピースが順次戻されます。

/* Fetch the locators */ 
...
     ub4    array_iter = 10;
     char  *bufp[10];
     oraub8 bufl[10];
     oraub8 char_amtp[10];
     oraub8 offset[10];
     sword  st;  

     for (i=0; i<10; i++)
     {
       bufp[i] = (char *)malloc(1000);
       bufl[i] = 1000;
       offset[i] = 1;
       char_amtp[i] = 10000;       /* Single byte fixed width char set. */
      }

      st =  OCILobArrayRead(<service context>, <error handle>,
                        &array_iter, /* array size */
                        lob_array,   /* array of locators */
                        NULL,        /* array of byte amounts */
                        char_amtp,   /* array of char amounts */
                        offset,      /* array of offsets */
               (void **)bufp,        /* array of read buffers */
                        bufl,        /* array of buffer lengths */
                        OCI_FIRST_PIECE,  /* piece information */
                        ctx,              /* callback context */
                        cbk_read_lob,     /* callback function */
                        0,                /* character set ID - default */
                        SQLCS_IMPLICIT);
...
/* Callback function for LOB array read. */
sb4 cbk_read_lob(dvoid *ctxp, ub4 array_iter, CONST dvoid *bufxp, oraub8 len,
                 ub1 piece, dvoid **changed_bufpp, oraub8 *changed_lenp)
{  
   static ub4 piece_count = 0;
   piece_count++;  
   switch (piece)
   {
    case OCI_LAST_PIECE: 
      /*--- buffer processing code goes here ---*/ 
(void) printf("callback read the %d th piece(last piece) for %dth locator \n\n",
                piece_count, array_iter ); 
      piece_count = 0; 
      break; 
    case OCI_FIRST_PIECE: 
      /*--- buffer processing code goes here ---*/ 
      (void) printf("callback read the 1st piece for %dth locator\n",
                    array_iter); 
    /* --Optional code to set changed_bufpp and changed_lenp if the buffer needs
         to be changed dynamically --*/ 
      break; 
    case OCI_NEXT_PIECE: 
      /*--- buffer processing code goes here ---*/ 
      (void) printf("callback read the %d th piece for %dth locator\n",
                    piece_count, array_iter); 
      /* --Optional code to set changed_bufpp and changed_lenp if the  buffer
           must be changed dynamically --*/ 
      break; 
      default:
      (void) printf("callback read error: unkown piece = %d.\n", piece); 
      return OCI_ERROR; 
   } 
    return OCI_CONTINUE;
}
...

ポーリングLOB配列読取り

次の例は、変数amtpbuflおよびoffsetを使用したOCILobArrayRead()におけるポーリングLOBデータです。

/* Fetch the locators */ 
...
 
     ub4    array_iter = 10;
     char  *bufp[10];
     oraub8 bufl[10];
     oraub8 char_amtp[10];
     oraub8 offset[10];
     sword  st;  
 
     for (i=0; i<10; i++)
     {
       bufp[i] = (char *)malloc(1000);
       bufl[i] = 1000;
       offset[i] = 1;
       char_amtp[i] = 10000;       /* Single byte fixed width char set. */
     }
 
     /* For 3rd locator read data in 500 bytes piece from offset 101. Amount
      * is 2000, that is, total number of pieces is 2000/500 = 4.
      */
     offset[2] = 101; bufl[2] = 500; char_amtp[2] = 2000;
     
     /* For 6th locator read data in 100 bytes piece from offset 51. Amount
      * is 0 indicating pure polling, that is, data is read till the end of
      * the LOB is reached.
      */
     offset[5] = 51;  bufl[5] = 100; char_amtp[5] = 0;
 
     /* For 8th locator read 100 bytes of data in one piece. Note amount 
      * is less than buffer length indicating single piece read.
      */ 
     offset[7] = 61;  bufl[7] = 200; char_amtp[7] = 100; 
 
     st =  OCILobArrayRead(<service context>, <error handle>,
                         &array_iter, /* array size */
                         lob_array, /* array of locators */
                         NULL,      /* array of byte amounts */
                         char_amtp, /* array of char amounts */
                         offset,    /* array of offsets */
                (void **)bufp,      /* array of read buffers */
                         bufl,      /* array of buffer lengths */
                         OCI_FIRST_PIECE, /* piece information */
                         NULL,           /* callback context */
                         NULL,           /* callback function */
                         0,              /* character set ID - default */
                         SQLCS_IMPLICIT); /* character set form */
 
     /* First piece for the first locator is read here. 
      * bufp[0]          => Buffer pointer into which data is read.
      * char_amtp[0 ]    => Number of characters read in current buffer
      *
      */ 
 
     while ( st == OCI_NEED_DATA)
     {  
          st =  OCILobArrayRead(<service context>, <error handle>,
                          &array_iter, /* array size */
                          lob_array, /* array of locators */
                          NULL,      /* array of byte amounts */
                          char_amtp, /* array of char amounts */
                          offset,    /* array of offsets */
                 (void **)bufp,      /* array of read buffers */
                          bufl,      /* array of buffer lengths */
                          OCI_NEXT_PIECE, /* piece information */
                          NULL,           /* callback context */
                          NULL,           /* callback function */
                          0,              /* character set ID - default */
                          SQLCS_IMPLICIT);
 
       /* array_iter returns the index of the current array element for which 
        * data is read. for example, aray_iter = 1 implies first locator,
        * array_iter = 2 implies second locator and so on.
        *
        * lob_array[ array_iter - 1]=> Lob locator for which data is read. 
        * bufp[array_iter - 1]      => Buffer pointer into which data is read.
        * char_amtp[array_iter - 1]=>Number of characters read in current buffer
        */
 
...
        /* Consume the data here */
...
     }

構文

OCIプログラム環境における構文については、次のマニュアルの項を参照してください。

C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobArrayRead()

次のプログラム環境での例を示します。

OCI: lreadarr.c

LOBの一部の読取り(SUBSTR)

この項では、SUBSTRを使用してLOBの一部を読み取る方法について説明します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「SUBSTR」、「OPEN」、「CLOSE」

  • C(OCI): 参照マニュアルはありません。

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL (Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意、および埋込みSQLおよびプリコンパイラ・ディレクティブのALLOCATE、LOB OPEN、LOB READ、LOB CLOSEに関する項。

  • C/C++ (Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」のLOB READに関する項。「PL/SQL DBMS_LOB.SUBSTR」も参照してください。

  • COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

  • Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): lsubstr.sql

  • OCI: 今回のリリースでは例は提供されません。

  • C++(OCCI): 今回のリリースでは例は提供されません。

  • COM(OO4O): lsubstr.bas

  • Java (JDBC): lsubstr.java

2つのLOBの全体または一部の比較

この項では、2つのLOBの全体または一部を比較する方法について説明します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「COMPARE」

  • C(OCI): 参照マニュアルはありません。

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「EXECUTE」。PL/SQL DBMS_LOB.COMPAREも参照。

  • C/C++ (Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」のEXECUTEに関する項。PL/SQL DBMS_LOB.COMPAREも参照してください。

  • COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

  • Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): lcompare.sql

  • C(OCI): 今回のリリースでは例は提供されません。

  • C++(OCCI): 今回のリリースでは例は提供されません。

  • COM(OO4O): lcompare.bas

  • Java(JDBC): lcompare.java

パターン: INSTRを使用したLOB内のパターンの有無の確認

この項では、INSTRを使用してLOB内のパターンの有無を確認する方法について説明します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「INSTR」

  • C(OCI): 参照マニュアルはありません。

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL (Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」のEXECUTEに関する項。PL/SQL DBMS_LOB.INSTRも参照してください。

  • C/C++ (Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」のEXECUTEに関する項。PL/SQL DBMS_LOB.INSTRも参照してください。

  • COM(OO4O): 参照マニュアルはありません。

  • Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): linstr.sql

  • C(OCI): 今回のリリースでは例は提供されません。

  • C++(OCCI): 今回のリリースでは例は提供されません。

  • COM(OO4O): 今回のリリースでは例は提供されません。

  • Java(JDBC): linstr.java

長さ: LOBの長さの取得

この項では、LOBの長さを取得する方法について説明します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「GETLENGTH」

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobGetLength2()

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB DESCRIBE」

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB DESCRIBE ...GET LENGTH...」

  • COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

  • Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): llength.sql

  • OCI: llength.c

  • C++(OCCI): 今回のリリースでは例は提供されません。

  • COM(OO4O): llength.bas

  • Java(JDBC): llength.java

他のLOBへのLOBの全体または一部のコピー

この項では、LOBの全体または一部を他のLOBにコピーする方法について説明します。これらのAPIでは、指定した量のデータがソースLOBから宛先LOBにコピーされます。

使用上の注意

このAPIを使用する場合は、次のことに注意してください。

コピーするデータ量の指定

DBMS_LOB.COPYファンクションのamountパラメータでは、次のいずれかの値を渡す必要があります。

  • ロードするデータの実際のサイズ以下の量。

  • 許容される最大LOBサイズはDBMS_LOB.LOBMAXSIZEです。この値を渡すと、ファンクションでLOB全体がロードされます。この方法は、LOBのサイズをイントロスペクトせずにLOB全体をロードする場合に役立ちます。

文字データの場合は量を文字数で指定し、バイナリ・データの場合はバイト数で指定することに注意してください。

更新前の行のロック

LOB値を更新する予定の場合は、更新前にそのLOBを含む行をロックする必要があります。SQL INSERT文およびUPDATE文は暗黙的に行をロックしますが、SQLプログラムおよびPL/SQLプログラムではSQL SELECT FOR UPDATE文を使用して、またOCIプログラムではOCI pinまたはlock関数を使用して明示的にロックします。

更新後のロケータの状態の詳細は、「更新済ロケータを介したLOBの更新の例」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「COPY」

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobCopy2」

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB COPY」。PL/SQL DBMS_LOB.COPYも参照。

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「埋込みSQL文およびディレクティブ」の「LOB COPY

  • COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

  • Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): lcopy.sql

  • OCI: lcopy.c

  • COM(OO4O): lcopy.bas

  • Java(JDBC): lcopy.java

LOBロケータのコピー

この項では、LOBロケータをコピーする方法について説明します。様々なロケータが、同じデータや異なるデータ、また現在のデータや過去のデータを指すことに注意してください。


注意:

PL/SQLを使用して1つのLOBを別のLOBに割り当てるには、「:=」演算子を使用します。詳細は、「読取り一貫性のあるロケータ」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): LOBロケータを他のLOBロケータに割り当てる方法は、「読取り一貫性のあるロケータ」を参照してください。

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobAssign()」、「OCILobIsEqual()

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「ALLOCATE」、「LOB ASSIGN」

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「SELECT」、「LOB ASSIGN」

  • COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

  • Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): lcopyloc.sql

  • OCI: lcopyloc.c

  • C++(OCCI): 今回のリリースでは例は提供されません。

  • COM(OO4O): lcopyloc.bas

  • Java(JDBC): lcopyloc.java

等値: 2つのLOBロケータが等しいかどうかの確認

この項では、2つのLOBロケータが等しいかどうかを確認する方法について説明します。2つのロケータが等しい場合、それらが同じバージョンのLOBデータを参照していることを意味します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobAssign()」、「OCILobIsEqual()

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 参照マニュアルはありません。

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB ASSIGN

  • COM(OO4O): 参照マニュアルはありません。

  • Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL: 今回のリリースでは例は提供されません。

  • OCI: lequal.c

  • C++(OCCI): 今回のリリースでは例は提供されません。

  • COM(OO4O): 今回のリリースでは例は提供されません。

  • Java(JDBC): lequal.java

LOBロケータが初期化されているかどうかの確認

この項では、LOBロケータが初期化されているかどうかを確認する方法について説明します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 参照マニュアルはありません。

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobLocatorIsInit()

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 参照マニュアルはありません。

  • C/C++ (Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」。C(OCI): OCILobLocatorIsInit()を参照してください。

  • COM(OO4O): 参照マニュアルはありません。

  • Java(JDBC): 参照マニュアルはありません。

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): 今回のリリースでは例は提供されません。

  • OCI: linit.c

  • C(OCCI): 今回のリリースでは例は提供されません。

  • COM(OO4O): 今回のリリースでは例は提供されません。

  • Java(JDBC): 今回のリリースでは例は提供されません。

LOBへの追加

この項では、バッファの内容をLOBに追加書込みする方法について説明します。

使用上の注意

このAPIの使用方法については、次のことに注意してください。

1つずつまたはピース単位の書込み

writeappend操作では、バッファがLOBの終わりに書き込まれます。

OCIでは、このコールを使用してバッファからピース単位でLOBに書き込むことができます。また、コールバックまたは標準のポーリング方法を使用してもピース単位に処理できます。

ピース単位の書込み: コールバックまたはポーリングの使用時期

ピース・パラメータの値がOCI_FIRST_PIECEの場合、データはコールバックまたはポーリングを介して提供される必要があります。

  • コールバック関数またはファンクションがcbfpパラメータ内に定義されている場合、ピースがパイプに書き込まれてから、このコールバック関数またはファンクションをコールして次のピースを取得します。各ピースはbufpから書き込まれます。

  • コールバック関数またはファンクションが定義されていないと、OCILobWriteAppend2()OCI_NEED_DATAエラー・コードを戻します。アプリケーションはOCILobWriteAppend2()を再びコールし、さらにLOBのピースを書き込む必要があります。このモードでは、ピースのサイズおよび位置が異なると、コールごとにバッファ・ポインタや長さが異なる場合があります。ピース値OCI_LAST_PIECEは、ピース単位の書込みを終了します。

更新前の行のロック: PL/SQL DBMS_LOBパッケージまたはOCIを使用してLOBの値を更新する前に、LOBを含む行をロックする必要があります。SQL INSERT文およびUPDATE文は暗黙的に行をロックしますが、SQLプログラムおよびPL/SQLプログラムではSQL SELECT FOR UPDATE文を使用して、またOCIプログラムではOCI pinまたはlock関数を使用して明示的にロックします。

更新後のロケータの状態の詳細は、「更新済ロケータを介したLOBの更新の例」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』「DBMS_LOB」WRITEAPPEND

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobWriteAppend2()」

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB WRITE APPEND

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB WRITE APPEND」

  • COM(OO4O): 参照マニュアルはありません。

  • Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): lwriteap.sql

  • OCI: lwriteap.c

  • C++(OCCI): 今回のリリースでは例は提供されません。

  • COM(OO4O): 今回のリリースでは例は提供されません。

  • Java(JDBC): lwriteap.java

LOBへのデータの書込み

この項では、バッファの内容をLOBに書き込む方法について説明します。

使用上の注意

このAPIの使用方法については、次のことに注意してください。

ストリーム書込み

大量のLOBデータを最も効率よく書き込むには、ポーリングまたはコールバックによってストリーム・メカニズムを有効にしたOCILobWrite2()を使用します。LOBに書き込むデータの量がわかっている場合は、OCILobWrite2()のコール時にそのデータ量を指定します。これにより、ディスク上のLOBデータが確実に連続したものになります。領域を効率的に利用できるのみでなく、LOBデータの連続性により、その後の操作で読み書きの速度が速くなります。

チャンク・サイズ

チャンクとは1つまたは複数のOracleブロックです。LOBを含む表を作成する場合に、LOB用のチャンク・サイズを指定できます。これは、LOB値に対してアクセスまたは変更を行うときに、Oracle Databaseが使用するデータ・サイズに対応します。チャンクの一部はシステム関連の情報を格納し、残りはLOB値を格納します。使用するAPIには、LOBチャンク内で使用され、LOB値を格納している領域の量を戻すファンクションがあります。PL/SQLでは、DBMS_LOB.GETCHUNKSIZEを使用します。OCIでは、OCILobGetChunkSize()を使用します。

書込みパフォーマンスを改善するための戻り値の複数倍の指定

これらのファンクションの1つによって戻された値を複数回使用してwrite要求を実行すると、パフォーマンスが向上します。これは、LOBチャンクがwrite要求ごとにバージョン化されるためです。すべてのwriteを1つのチャンクで行うと、余分なバージョン化は行われません。使用しているアプリケーションに問題がなければ、同じサイズのLOBチャンクで複数回のLOB書込みコールを発行するのではなく、十分なサイズのチャンクにバッチ書込みを行うと、パフォーマンスが向上します。

更新前の行のロック

PL/SQL DBMS_LOBパッケージまたはOCIを使用してLOBの値を更新する前に、LOBを含む行をロックする必要があります。SQL INSERT文およびUPDATE文は暗黙的に行をロックしますが、SQLプログラムおよびPL/SQLプログラムではSQL SELECT FOR UPDATE文を使用して、またOCIプログラムではOCI pinまたはlock関数を使用して明示的にロックします。

更新後のロケータの状態の詳細は、「更新済ロケータを介したLOBの更新の例」を参照してください。

DBMS_LOB.WRITEを使用したBLOBへのデータの書込み

16進文字列をDBMS_LOB.WRITE()に渡してBLOBにデータを書き込む場合は、次のガイドラインに従ってください。

  • amountパラメータは、バッファのlengthパラメータ以下にする必要があります。

  • バッファのlengthは((amount*2) - 1)です。このようなガイドラインがあるのは、文字列の2文字が1つの16進文字とみなされ(そして、暗黙的に16進からRAWへの変換が実行され)、文字列の2バイトごとに1 RAWバイトに変換されるためです。

正しい例は、次のとおりです。

declare
   blob_loc  BLOB;
   rawbuf RAW(10);
   an_offset INTEGER := 1;
   an_amount BINARY_INTEGER := 10;
BEGIN
   select blob_col into blob_loc from a_table
where id = 1;
   rawbuf := '1234567890123456789';
   dbms_lob.write(blob_loc, an_amount, an_offset,
rawbuf);
   commit;
END;

前の例のan_amountの値を次の値に置き換えると、エラー・メッセージORA-21560が戻されます。

    an_amount BINARY_INTEGER := 11;

または

    an_amount BINARY_INTEGER := 19;

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』「DBMS_LOB」の「WRITE」

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobWrite2()」

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB WRITE

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB WRITE」

  • COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

  • Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): lwrite.sql

  • OCI: lwrite.c

  • COM(OO4O): lwrite.bas

  • Java(JDBC): lwrite.java

LOB配列書込み

この項では、OCILobArrayWrite()を使用して、1回のラウンドトリップで複数のロケータに対してLOBデータを読み取る方法について説明します。

使用上の注意


関連項目:

「LOB配列読取り」の配列読取り/書込みの例

ポーリング・モードでのLOB配列書込み

次の例では、バッファ・サイズが1KBの10個のロケータのそれぞれに対して、10KBのデータが書き込まれます。OCILobArrayWrite()は、すべてのデータを書き込むために100(10 × 10)回コールされる必要があります。このファンクションは、OCILobWrite2()と同様の方法で使用されます。

/* Fetch the locators */
...
 
/* array_iter parameter indicates the number of locators in the array read.
 * It is an IN parameter for the 1st call in polling and is ignored as IN
 * parameter for subsequent calls. As an OUT parameter it indicates the locator
 * index for which the piece is written.
 */
 
ub4    array_iter = 10;
char  *bufp[10];
oraub8 bufl[10];
oraub8 char_amtp[10];
oraub8 offset[10];
sword  st;
int    i, j; 
 
for (i=0; i<10; i++)
{
  bufp[i] = (char *)malloc(1000);
  bufl[i] = 1000;
  /* Fill bufp here. */
...
  offset[i] = 1;
  char_amtp[i] = 10000;       /* Single byte fixed width char set. */  
}
 
for (i  = 1; i <= 10; i++)
{
 /* Fill up bufp[i-1] here.  The first piece for ith locator would be written from
    bufp[i-1] */
...
    st =  OCILobArrayWrite(<service context>, <error handle>,
                      &array_iter, /* array size */
                      lob_array,   /* array of locators */
                      NULL,        /* array of byte amounts */
                      char_amtp,   /* array of char amounts */
                      offset,      /* array of offsets */
             (void **)bufp,        /* array of write buffers */
                      bufl,        /* array of buffer lengths */
                      OCI_FIRST_PIECE, /* piece information */
                      NULL,            /* callback context */
                      NULL,            /* callback function */
                      0,               /* character set ID - default */
                      SQLCS_IMPLICIT); /* character set form */
 
 for ( j = 2; j < 10; j++) 
 {
 /* Fill up bufp[i-1] here.  The jth piece for ith locator would be written from
    bufp[i-1] */
...
 st =  OCILobArrayWrite(<service context>, <error handle>,
                        &array_iter, /* array size */
                        lob_array,   /* array of locators */
                        NULL,        /* array of byte amounts */
                        char_amtp,   /* array of char amounts */
                        offset,      /* array of offsets */
               (void **)bufp,        /* array of write buffers */
                        bufl,        /* array of buffer lengths */
                        OCI_NEXT_PIECE, /* piece information */
                        NULL,           /* callback context */
                        NULL,           /* callback function */
                        0,              /* character set ID - default */
                        SQLCS_IMPLICIT);
 
    /* array_iter returns the index of the current array element for which
     * data is being written. for example, aray_iter = 1 implies first locator,
     * array_iter = 2 implies second locator and so on. Here i = array_iter.
     *
     * lob_array[ array_iter - 1] => Lob locator for which data is written.
     * bufp[array_iter - 1]       => Buffer pointer from which data is written.
     * char_amtp[ array_iter - 1] => Number of characters written in
     * the piece just written
     */
}

/* Fill up bufp[i-1] here.  The last piece for ith locator would be written from
   bufp[i -1] */
...       
 st =  OCILobArrayWrite(<service context>, <error handle>,
                        &array_iter, /* array size */
                        lob_array,   /* array of locators */
                        NULL,        /* array of byte amounts */
                        char_amtp,   /* array of char amounts */
                        offset,      /* array of offsets */
               (void **)bufp,        /* array of write buffers */
                        bufl,        /* array of buffer lengths */
                        OCI_LAST_PIECE,  /* piece information */
                        NULL,            /* callback context */
                        NULL,            /* callback function */
                        0,               /* character set ID - default */
                        SQLCS_IMPLICIT);
}

...

コールバックによるLOB配列書込み

次の例では、バッファ・サイズが1KBの10個のロケータのそれぞれに対して、10KBのデータが書き込まれます。合計100ピース(ロケータごとに10ピース)を書き込む必要があります。最初のピースはOCILobArrayWrite()コールによって提供されます。コールバック関数またはファンクションは99回コールされ、書込み対象の以降のピースに対してデータが取得されます。

/* Fetch the locators */
...

    ub4    array_iter = 10;
    char  *bufp[10];
    oraub8 bufl[10];
    oraub8 char_amtp[10];
    oraub8 offset[10];
    sword  st; 
 
    for (i=0; i<10; i++)
    {
      bufp[i] = (char *)malloc(1000);
      bufl[i] = 1000;
      offset[i] = 1;
      char_amtp[i] = 10000;       /* Single byte fixed width char set. */
    }
 
 st =  OCILobArrayWrite(<service context>, <error handle>,
                        &array_iter, /* array size */
                        lob_array,   /* array of locators */
                        NULL,        /* array of byte amounts */
                        char_amtp,   /* array of char amounts */
                        offset,      /* array of offsets */
               (void **)bufp,        /* array of write buffers */
                        bufl,        /* array of buffer lengths */
                        OCI_FIRST_PIECE,  /* piece information */
                        ctx,              /* callback context */
                        cbk_write_lob     /* callback function */
                        0,                /* character set ID - default */
                        SQLCS_IMPLICIT);

...

/* Callback function for LOB array write. */
sb4 cbk_write_lob(dvoid *ctxp, ub4 array_iter, dvoid *bufxp, oraub8 *lenp,
                  ub1 *piecep, ub1 *changed_bufpp, oraub8 *changed_lenp)
{
 static ub4 piece_count = 0;
 piece_count++; 

 printf (" %dth piece written  for %dth locator \n\n", piece_count, array_iter);

 /*-- code to fill bufxp with data goes here. *lenp should reflect the  size and
  *   should be less than or equal to MAXBUFLEN -- */
 /* --Optional code to set changed_bufpp and changed_lenp if the buffer must
  *   be changed dynamically --*/

  if (this is the last data buffer for current locator)
     *piecep = OCI_LAST_PIECE;     
  else if (this is the first data buffer for the next locator)
     *piecep = OCI_FIRST_PIECE;
     piece_count = 0;
  else
     *piecep = OCI_NEXT_PIECE;
 
     return OCI_CONTINUE;
    }
...

配列書込みにおけるポーリングLOBデータ

次の例は、変数amtpbuflおよびoffsetを使用したOCILobArrayWrite()におけるポーリングLOBデータです。

/* Fetch the locators */
...
 
ub4    array_iter = 10;
char  *bufp[10];
oraub8 bufl[10];
oraub8 char_amtp[10];
oraub8 offset[10];
sword  st;
int    i, j;
int piece_count; 
 
for (i=0; i<10; i++)
{
  bufp[i] = (char *)malloc(1000);
  bufl[i] = 1000;
  /* Fill bufp here. */
...
  offset[i] = 1;
  char_amtp[i] = 10000;       /* Single byte fixed width char set. */  
}
 
     /* For 3rd locator write data in 500 bytes piece from offset 101. Amount
      * is 2000, that is, total number of pieces is 2000/500 = 4.
      */
     offset[2] = 101; bufl[2] = 500; char_amtp[2] = 2000;
     
     /* For 6th locator write data in 100 bytes piece from offset 51. Amount
      * is 0 indicating pure polling, that is, data is written 
      * till OCI_LAST_PIECE
      */
     offset[5] = 51;  bufl[5] = 100; char_amtp[5] = 0;
 
     /* For 8th locator write 100 bytes of data in one piece. Note amount 
      * is less than buffer length indicating single piece write.
      */ 
     offset[7] = 61;  bufl[7] = 200; char_amtp[7] = 100;
 
for (i  = 1; i <= 10; i++)
{
 /* Fill up bufp[i-1] here.  The first piece for ith locator would be written from
    bufp[i-1] */
...
    /* Calculate number of pieces that must be written */
    piece_count = char_amtp[i-1]/bufl[i-1];
 
    /* Single piece case */
    if (char_amtp[i-1] <= bufl[i-1])
      piece_count = 1;
 
    /* Zero amount indicates pure polling. So we can write as many
     * pieces as needed. Let us write 50 pieces.
     */
    if (char_amtp[i-1] == 0)
      piece_count = 50;
 
    st =  OCILobArrayWrite(<service context>, <error handle>,
                      &array_iter, /* array size */
                      lob_array,   /* array of locators */
                      NULL,        /* array of byte amounts */
                      char_amtp,   /* array of char amounts */
                      offset,      /* array of offsets */
             (void **)bufp,        /* array of write buffers */
                      bufl,        /* array of buffer lengths */
                      OCI_FIRST_PIECE, /* piece information */
                      NULL,            /* callback context */
                      NULL,            /* callback function */
                      0,               /* character set ID - default */
                      SQLCS_IMPLICIT); /* character set form */
 
 for ( j = 2; j < piece_count; j++) 
 {
   /* Fill up bufp[i-1] here. The jth piece for ith locator would be written
    * from bufp[i-1] */
...
   st =  OCILobArrayWrite(<service context>, <error handle>,
                          &array_iter, /* array size */
                          lob_array,   /* array of locators */
                          NULL,        /* array of byte amounts */
                          char_amtp,   /* array of char amounts */
                          offset,      /* array of offsets */
                 (void **)bufp,        /* array of write buffers */
                          bufl,        /* array of buffer lengths */
                          OCI_NEXT_PIECE, /* piece information */
                          NULL,           /* callback context */
                          NULL,           /* callback function */
                          0,              /* character set ID - default */
                          SQLCS_IMPLICIT);
 
    /* array_iter returns the index of the current array element for which
     * data is being written. for example, aray_iter = 1 implies first locator,
     * array_iter = 2 implies second locator and so on. Here i = array_iter.
     *
     * lob_array[ array_iter - 1] => Lob locator for which data is written.
     * bufp[array_iter - 1]       => Buffer pointer from which data is written.
     * char_amtp[ array_iter - 1] => Number of characters written in
     * the piece just written
     */
}
 
/* Fill up bufp[i-1] here.  The last piece for ith locator would be written from
 * bufp[i -1] */
...
 
/* If piece_count is 1 it is a single piece write. */
if (piece_count[i] != 1)
  st =  OCILobArrayWrite(<service context>, <error handle>,
                          &array_iter, /* array size */
                          lob_array,   /* array of locators */
                          NULL,        /* array of byte amounts */
                          char_amtp,   /* array of char amounts */
                          offset,      /* array of offsets */
                 (void **)bufp,        /* array of write buffers */
                          bufl,        /* array of buffer lengths */
                          OCI_LAST_PIECE,  /* piece information */
                          NULL,            /* callback context */
                          NULL,            /* callback function */
                          0,               /* character set ID - default */
                          SQLCS_IMPLICIT);
}
 
...

構文

OCIプログラム環境における構文については、次のマニュアルの項を参照してください。

C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobArrayWrite()

次のプログラム環境での例を示します。

OCI: lwritearr.c

LOBデータの切捨て

この項では、LOBを指定のサイズまで切り捨てる方法について説明します。

使用上の注意

このAPIの使用方法については、次のことに注意してください。

更新前の行のロック

PL/SQL DBMS_LOBパッケージまたはOCIを使用してLOBの値を更新する前に、LOBを含む行をロックする必要があります。SQL INSERT文およびUPDATE文は暗黙的に行をロックしますが、次の方法を使用すると明示的にロックを行うことができます。

  • SQLプログラムおよびPL/SQLプログラムではSELECT FOR UPDATE

  • OCIプログラムではOCI pinまたはlock関数

更新後のロケータの状態の詳細は、「更新済ロケータを介したLOBの更新の例」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』「DBMS_LOB」の「TRIM

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobTrim2()」

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB TRIM

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB TRIM

  • COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

  • Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): ltrim.sql

  • OCI: ltrim.c

  • C++(OCCI): 今回のリリースでは例は提供されません。

  • COM(OO4O): ltrim.bas

  • Java(JDBC): ltrim.java

LOBの一部の消去

この項では、LOBの一部を消去する方法について説明します。

使用上の注意

このAPIの使用方法については、次のことに注意してください。

更新前の行のロック

PL/SQL DBMS_LOBパッケージまたはOCIを使用してLOBの値を更新する前に、LOBを含む行をロックする必要があります。SQL INSERT文およびUPDATE文は暗黙的に行をロックしますが、SQLプログラムおよびPL/SQLプログラムではSQL SELECT FOR UPDATE文を使用して、またOCIプログラムではOCI pinまたはlock関数を使用して明示的にロックします。

更新後のロケータの状態の詳細は、「更新済ロケータを介したLOBの更新の例」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「ERASE」

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobErase2()

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB ERASE」に関する項

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB ERASE

  • COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

  • Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): lerase.sql

  • OCI: lerase.c

  • C++(OCCI): 今回のリリースでは例は提供されません。

  • COM(OO4O): lerase.bas

  • Java(JDBC): lerase.java

LOBバッファリングの使用可能化

この項では、LOBバッファリングを使用可能にする方法について説明します。

使用上の注意

少量のデータの読取りおよび書込みを実行する場合は、LOBバッファリングを使用可能にします。これらの作業を完了したら、他のLOB操作を行う前にバッファリングを使用禁止にする必要があります。


注意:

  • バッファをフラッシュし、変更を永続的にする必要があります。

  • チェックインおよびチェックアウトを伴うストリーム読取りおよび書込みを実行する場合は、バッファリングを使用可能にしないでください。


詳細は、「LOBバッファリング・サブシステム」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL: このAPIは、提供されるPL/SQLパッケージでは使用できません。

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCIEnableLobBuffering()」、「OCIDisableLobBuffering()」、「OCIFlushBuffer()

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB ENABLE BUFFERING」

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB ENABLE BUFFERING

  • COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

  • Java(JDBC): 参照マニュアルはありません。

次のプログラム環境での例を示します。

  • PL/SQL: 例は提供されません。

  • C(OCI): 今回のリリースでは例は提供されません。このAPIの使用方法に類似する例は、「LOBバッファリングの使用禁止化」を参照してください。

  • C++(OCCI): 今回のリリースでは例は提供されません。

  • COM(OO4O): lenbuf.bas

  • Java(JDBC): 例は提供されません。

バッファのフラッシュ

この項では、LOBバッファをフラッシュする方法について説明します。

使用上の注意

少量のデータの読取りおよび書込みを実行する場合は、バッファリングを使用可能にします。これらの作業を完了したら、他のLOB操作を行う前にバッファリングを使用禁止にする必要があります。


注意:

  • バッファをフラッシュし、変更を永続的にする必要があります。

  • チェックインおよびチェックアウトを伴うストリーム読取りおよび書込みを実行する場合は、バッファリングを使用可能にしないでください。


詳細は、「LOBバッファリング・サブシステム」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOBパッケージ): 参照マニュアルはありません。

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCIEnableLobBuffering()」、「OCIDisableLobBuffering()」、「OCIFlushBuffer()」

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB FLUSH BUFFER」

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB FLUSH BUFFER」

  • COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

  • Java(JDBC): 参照マニュアルはありません。

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): 今回のリリースでは例は提供されません。

  • C(OCI): 今回のリリースでは例は提供されません。このAPIの使用方法に類似する例は、「LOBバッファリングの使用禁止化」を参照してください。

  • C++(OCCI): 今回のリリースでは例は提供されません。

  • COM(OO4O): 今回のリリースでは例は提供されません。

  • Java(JDBC): 今回のリリースでは例は提供されません。

LOBバッファリングの使用禁止化

この項では、LOBバッファリングを使用禁止にする方法について説明します。

使用上の注意

少量のデータの読取りおよび書込みを実行する場合は、バッファリングを使用可能にします。これらの作業を完了したら、他のLOB操作を行う前にバッファリングを使用禁止にする必要があります。


注意:

  • バッファをフラッシュし、変更を永続的にする必要があります。

  • チェックインおよびチェックアウトを伴うストリーム読取りおよび書込みを実行する場合は、バッファリングを使用可能にしないでください。


詳細は、「LOBバッファリング・サブシステム」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL (DBMS_LOBパッケージ): 参照マニュアルはありません。

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCIEnableLobBuffering()」、「OCIDisableLobBuffering()」、「OCIFlushBuffer()

  • C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB DISABLE BUFFER」

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB DISABLE BUFFER」

  • COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

  • Java(JDBC): 参照マニュアルはありません。

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): 今回のリリースでは例は提供されません。

  • OCI: ldisbuf.c

  • C++(OCCI): 今回のリリースでは例は提供されません。

  • COM(OO4O): ldisbuf.bas

  • Java(JDBC): 今回のリリースでは例は提供されません。

LOBインスタンスが一時LOBであるかどうかの確認

この項では、LOBインスタンスが一時LOBであるかどうかを確認する方法について説明します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

  • PL/SQL(DBMS_LOB): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「ISTEMPORARY」、「FREETEMPORARY」

  • C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobIsTemporary()」

  • COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB DESCRIBE」、「ISTEMPORARY」

  • C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB DESCRIBE...ISTEMPORARY」

  • COM(OO4O): 参照マニュアルはありません。

  • Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

次のプログラム環境での例を示します。

  • PL/SQL(DBMS_LOBパッケージ): listemp.sql

  • OCI: listemp.c

  • COM(OO4O): 例は提供されません。

Java(JDBC): BLOBが一時LOBであるかどうかの確認

BLOBが一時LOBかどうかの判別に、JDBCアプリケーションでは、現在のBLOBオブジェクトについてはisTemporaryインスタンス・メソッドを使用し、指定されたBLOBオブジェクトについては、そのBLOBオブジェクトを静的なisTemporaryメソッドに渡して確認できます。これらの2つのメソッドは、listempb.javaで定義されています。

このJDBC APIによって、以前のDBMS_LOB.isTemporary()を使用する必要がなくなります。

CLOBが一時的かどうかを判定するには、JDBCアプリケーションでisTemporaryインスタンス・メソッドを使用して現在のCLOBオブジェクトが一時的かどうかを判定する方法と、CLOBオブジェクトを静的なisTemporaryメソッドに渡す方法があります。これらの2つのメソッドは、listempc.javaで定義されています。

BLOBからCLOBへの変換

PL/SQL DBMS_LOB.CONVERTTOCLOBプロシージャを使用すると、BLOBインスタンスをCLOBに変換できます。この方法は、CLOBに格納する文字データがバイナリ形式で格納されている場合に役立ちます。このプロシージャのコール時に、バイナリ・データのキャラクタ・セットを指定します。このプロシージャの構文と使用方法の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

CLOBからBLOBへの変換

PL/SQL DBMS_LOB.CONVERTTOBLOBプロシージャを使用すると、CLOBインスタンスをBLOBインスタンスに変換できます。この方法では、LOB APIを使用して文字データをバイナリ・データに簡単に変換できます。このプロシージャの構文と使用方法の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

読取り一貫性の保証

このスクリプトを使用して、NOLOGGINGまたはFILESYSTEM_LIKE_LOGGING LOBを持つ、読取り非一貫性のないリカバリ・ポイントを把握している表のホット・バックアップを確実に取ることができます。

ALTER DATABASE FORCE LOGGING;
SELECT CHECKPOINT_CHANGE# FROM V$DATABASE;  --Start SCN

SCN(システム変更番号)は、トランザクションがコミットされた時点のデータベースのバージョンを定義するスタンプです。

バックアップを実行します。

次のスクリプトを実行します。

ALTER SYSTEM CHECKPOINT GLOBAL;
SELECT CHECKPOINT_CHANGE# FROM V$DATABASE;  --End SCN
ALTER DATABASE NO FORCE LOGGING;

データベースで生成されたアーカイブ・ログをバックアップします。少なくとも、開始SCNと終了SCN(両方のSCN時点を含む)の間のアーカイブ・ログはバックアップする必要があります。

読取り非一貫性のない時点までリストアするため、不完全なリカバリの時点として終了SCNまでリストアします。終了SCNより後のSCNにリカバリを実行すると、NOLOGGING LOBで読取り非一貫性が発生する可能性があります。

SecureFilesでは、メディア・リカバリ中に読取り非一貫性が検出されると、データベースにより一貫性のないブロックがホールとして処理され、BLOB0が、CLOBに充填文字が格納されます。