この章では、BLOB、CLOBおよびNCLOBデータ型の操作を実行するAPIについて説明します。この章で説明する操作は、永続LOBインスタンスまたは一時LOBインスタンスに使用できます。BFILEには適用されないことに注意してください。この章で説明するAPIのリストは、表15-1を参照してください。
|
関連項目:
|
この章では、操作ごとに次の項目について説明します。
「事前条件」では、各操作をコールする前に存在している必要のある依存性と満たしている必要のある条件について説明します。
「使用上の注意」では、特定のプログラム環境またはデータ型に固有の情報など、実装時のガイドラインを示します。
「構文」では、サポートされているプログラム環境ごとに構文の参照先マニュアルを示します。
「例」では、特定の例を実行するために必要なセットアップ作業について説明します。掲載されているデモ・ファイルは、$ORACLE_HOME/rdbms/demo/lobs/のplsql、oci、vbおよびjavaという名前のサブディレクトリにあります。ドライバ・プログラムlobdemo.sqlは/plsqlにあり、ドライバ・プログラムlobdemo.cは/ociにあります。
この章の内容は次のとおりです。
表15-1「LOB APIについてサポートされている環境」に、この章で説明するAPIについてサポートされているプログラム環境を示します。第1列は、APIで実行される操作を示します。その他の列は、そのAPIがPL/SQL、OCI、OCCI、COBOL、Pro*C/C++、COMおよびJDBCでサポートされているかどうかに応じて、「はい」または「いいえ」となっています。
表15-1 LOB APIについてサポートされている環境
| 操作 | PL/SQL | OCI | OCCI | COBOL | Pro*C/C++ | COM | JDBC |
|---|---|---|---|---|---|---|---|
|
はい |
はい |
いいえ |
はい |
はい |
はい |
はい |
|
|
いいえ |
はい |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
|
|
いいえ |
はい |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
|
|
チャンク・サイズの決定、関連項目: 「LOBへのデータの書込み」 |
はい |
はい |
はい |
はい |
はい |
はい |
はい |
|
はい |
いいえ |
いいえ |
はい |
はい |
はい |
はい |
|
|
はい |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
|
|
はい |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
|
|
はい |
はい |
いいえ |
はい |
はい |
はい |
はい |
|
|
はい |
はい |
いいえ |
はい |
はい |
はい |
はい |
|
|
いいえ |
はい |
いいえ |
はい |
はい |
はい |
いいえ |
|
|
はい |
はい |
いいえ |
はい |
はい |
はい |
はい |
|
|
いいえ |
いいえ |
いいえ |
はい |
はい |
はい |
いいえ |
|
|
いいえ |
はい |
いいえ |
いいえ |
はい |
いいえ |
はい |
|
|
はい |
はい |
いいえ |
はい |
はい |
はい |
はい |
|
|
いいえ |
はい |
いいえ |
はい |
はい |
いいえ |
いいえ |
|
|
いいえ |
はい |
いいえ |
いいえ |
はい |
いいえ |
いいえ |
|
|
はい |
はい |
いいえ |
はい |
はい |
はい |
はい |
|
|
はい |
はい |
いいえ |
はい |
はい |
はい |
はい |
|
|
はい |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
|
|
はい |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
|
|
|
いいえ |
はい |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
|
|
いいえ |
はい |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
|
OPENおよびCLOSEインタフェースを使用した永続LOBのオープン |
はい |
はい |
はい |
はい |
はい |
はい |
はい |
|
オープン: LOBがオープンしているかどうかの確認 |
はい |
はい |
はい |
はい |
はい |
はい |
はい |
|
はい |
いいえ |
いいえ |
はい |
はい |
いいえ |
はい |
|
|
はい |
いいえ |
いいえ |
はい |
はい |
はい |
はい |
|
|
はい |
はい |
いいえ |
はい |
はい |
はい |
はい |
|
|
記憶域の制限、決定: サイズがTBのLOBの最大記憶域の制限 |
はい |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
|
はい |
はい |
いいえ |
はい |
はい |
はい |
はい |
|
|
WriteNoAppend、関連項目: 「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(DBM_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インスタンスの作成方法は、第13章「永続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を取得する方法について説明します。
構文
各プログラム環境における構文については、次のマニュアルの項を参照してください。
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データ型である永続LOBインスタンスまたは一時LOBインスタンスにデータをロードできます。
|
関連項目:
|
事前条件
BFILEデータをLOBにロードする前に、次の条件を満たしている必要があります。
BFILEが存在すること。
ターゲットのLOBインスタンスが存在すること。
使用上の注意
この操作については、次の注意事項があります。
文字データのロード時のLOADCLOBFROMFILEの使用
CLOBまたはNCLOBインスタンスをロードするのにDBMS_LOB.LOADFROMFILEプロシージャを使用すると、BFILEのバイナリ・データがLOBにロードされ、暗黙的なキャラクタ・セット変換は実行されません。このため、文字データをロードするにはDBMS_LOB.LOADCLOBFROMFILEプロシージャの使用をお薦めします。詳細は、「CLOBまたはNCLOBへのBFILEデータのロード」を参照してください。
BFILEデータのロード量の指定
表15-2に示すファンクションの量パラメータでは、次のいずれかの値を渡す必要があります。
ロードするBFILEの実際のサイズ(バイト単位)以下の量。
最大許容LOBサイズ(バイトで表されます)。この値を渡すと、BFILE全体がロードされます。この方法を使用すると、ロード前にBFILEのサイズを確認せずにBFILE全体をロードできます。最大許容LOBサイズを取得するには、表15-2に示す方法を使用します。
表15-2 ファイルからのロード操作用の最大LOBサイズ
| 環境 | ファンクション | 最大LOBサイズを渡すために取得する値 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
(LOBのサイズが任意の場合) |
|
|
|
(LOBのサイズが4GB未満の場合) |
|
構文
各プログラム環境でこの操作を使用する方法の詳細は、次のマニュアルを参照してください。
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データをロードします。このプロシージャを使用すると、通常のBLOBインスタンスまたは一時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またはNCLOBインスタンスあるいは一時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の様々な使用方法を示します。
次の項目の例を示します。
デフォルトCSID(0)の使用方法
BFILEに対してgetlengthをコールせずに、ファイル全体をロードする方法
戻されたオフセット値を使用して、実際にロードしたデータ量を計算する方法
この例では、ad_sourceがUTF8キャラクタ・セット・フォーマットのBFILEで、データベースのキャラクタ・セットがUTF8であることを想定しています。オンライン・ファイルはlldclobf.sqlです。
次の項目の例を示します。
NLS_CHARSET_IDファンクションを使用して、キャラクタ・セット名からキャラクタ・セットIDを取得する方法
戻されたオフセット値および言語コンテキストlang_ctxを使用して、1つのBFILEから複数のLOBにストリームのデータをロードする方法
警告メッセージの読取り方法
この例では、ad_file_ext_01がJA16TSTSETフォーマットのBFILEで、データベースの各国語キャラクタ・セットがAL16UTF16であることを想定しています。オンライン・ファイルはlldclobs.sqlです。
この操作では、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
次に、BLOBまたは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 (); ...
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データの読取りに使用できるAPIについて説明します。この操作を使用してLOBデータをバッファに読み取ることができます。この操作は、アプリケーションで大量のLOBデータを表示したり、データ・ストリーム操作が必要な場合に役立ちます。
使用上の注意
これらのAPIを使用する場合は、次のことに注意してください。
ストリーム・メカニズム
大量のLOBデータを最も効率よく読み取るには、ストリーム・メカニズムを有効にしたOCILobRead2()を使用します。
量パラメータ
表15-3に示すAPIの場合、量パラメータに渡す値には制限があります。
表15-3 量パラメータの最大LOBサイズ
| 環境 | ファンクション | 量パラメータの値の制限 |
|---|---|---|
|
DBMS_LOB |
|
32KBのバッファ・サイズ。 |
|
OCI |
(LOBのサイズが4GB未満の場合) |
この量を指定するとファイル全体が読み取られます。 |
|
OCI |
(LOBのサイズが任意の場合) |
この量を指定するとファイル全体が読み取られます。 |
構文
各プログラム環境における構文については、次のマニュアルの項を参照してください。
PL/SQL(DBM_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開発者ガイド』
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
この項では、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ブロックです。BASICFILE LOBを含む表を作成する場合に、BASICFILE LOB用のチャンク・サイズを指定できます。これは、LOB値に対してアクセスまたは変更を行うときに、Oracle Databaseが使用するデータ・サイズに対応します。チャンクの一部はシステム関連の情報を格納し、残りはLOB値を格納します。使用するAPIには、LOBチャンク内で使用され、LOB値を格納している領域の量を戻すファンクションがあります。PL/SQLでは、DBMS_LOB.GETCHUNKSIZEを使用します。OCIでは、OCILobGetChunkSize()を使用します。SECUREFILE LOBでは、CHUNKは、アドバイザ・サイズで、後方互換性のために使用します。
これらのファンクションの1つによって戻された値を複数回使用してwrite要求を実行すると、パフォーマンスが向上します。これは、ディスクからのデータの読取り時に、Oracleデータベースで使用されているサイズと同じ単位を使用するためです。アプリケーションで問題が発生しないかぎり、同じLOBチャンクに複数回のLOB読取りコールを発行するのではなく、チャンク全体の取得に十分なサイズでバッチ読取りを行うと、パフォーマンスが向上します。
構文
各プログラム環境における構文については、次のマニュアルの項を参照してください。
PL/SQL(DBM_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」のOPEN、GETCHUNKSIZE、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開発者ガイド』
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
この項では、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_PIECEをpieceパラメータとして使用して、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
needs to be changed dynamically --*/
break;
default:
(void) printf("callback read error: unkown piece = %d.\n", piece);
return OCI_ERROR;
}
return OCI_CONTINUE;
}
...
ポーリングLOB配列読取り
次の例は、変数amtp、buflおよび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 will be 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 will be 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
この項では、SUBSTRを使用してLOBの一部を読み取る方法について説明します。
構文
各プログラム環境における構文については、次のマニュアルの項を参照してください。
PL/SQL(DBM_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」、および『Oracle Database 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の全体または一部を比較する方法について説明します。
構文
各プログラム環境における構文については、次のマニュアルの項を参照してください。
PL/SQL(DBM_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内のパターンの有無を確認する方法について説明します。
構文
各プログラム環境における構文については、次のマニュアルの項を参照してください。
PL/SQL(DBM_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の長さを取得する方法について説明します。
構文
各プログラム環境における構文については、次のマニュアルの項を参照してください。
PL/SQL(DBM_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にコピーする方法について説明します。これらの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(DBM_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ロケータをコピーする方法について説明します。様々なロケータが、同じデータや異なるデータ、また現在のデータや過去のデータを指すことに注意してください。
|
注意: 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データを参照していることを意味します。
構文
各プログラム環境における構文については、次のマニュアルの項を参照してください。
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ロケータが初期化されているかどうかを確認する方法について説明します。
構文
各プログラム環境における構文については、次のマニュアルの項を参照してください。
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に追加書込みする方法について説明します。
使用上の注意
このAPIの使用方法については、次のことに注意してください。
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(DBM_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に書き込む方法について説明します。
使用上の注意
この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進からローへの暗黙的な変換が行われる)ためです。すなわち、文字列が2バイトごとに1つのロー・バイトへ変換されます。
次は正しい例です。
declareblob_loc BLOB;rawbuf RAW(10);an_offset INTEGER := 1;an_amount BINARY_INTEGER := 10;BEGINselect blob_col into blob_loc from a_tablewhere 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(DBM_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
この項では、OCILobArrayWrite()を使用して、1回のラウンドトリップで複数のロケータに対して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 needs to
* 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データ
次の例は、変数amtp、buflおよび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 will be 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 will be 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 need to 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を指定のサイズまで切り捨てる方法について説明します。
使用上の注意
このAPIの使用方法については、次のことに注意してください。
PL/SQL DBMS_LOBパッケージまたはOCIを使用してLOBの値を更新する前に、LOBを含む行をロックする必要があります。SQL INSERT文およびUPDATE文は暗黙的に行をロックしますが、次の方法を使用すると明示的にロックを行うことができます。
SQLプログラムおよびPL/SQLプログラムではSELECT FOR UPDATE文
OCIプログラムではOCI pinまたはlock関数
更新後のロケータの状態の詳細は、「更新済ロケータを介したLOBの更新の例」を参照してください。
構文
各プログラム環境における構文については、次のマニュアルの項を参照してください。
PL/SQL(DBM_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の一部を消去する方法について説明します。
使用上の注意
この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(DBM_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およびプリコンパイラ・ディレクティブ」のINSERTに関する項
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バッファリング・サブシステム」を参照してください。
構文
各プログラム環境における構文については、次のマニュアルの項を参照してください。
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バッファリング・サブシステム」を参照してください。
構文
各プログラム環境における構文については、次のマニュアルの項を参照してください。
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であるかどうかを確認する方法について説明します。
構文
各プログラム環境における構文については、次のマニュアルの項を参照してください。
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): 例は提供されません。
BLOBが一時LOBかどうかの判別に、JDBCアプリケーションでは、現在のBLOBオブジェクトについてはisTemporaryインスタンス・メソッドを使用し、指定されたBLOBオブジェクトについては、そのBLOBオブジェクトを静的なisTemporaryメソッドに渡して確認できます。これらの2つのメソッドは、listempb.javaで定義されています。
このJDBC APIによって、以前のDBMS_LOB.isTemporary()を使用する必要がなくなります。
CLOBが一時LOBかどうかの判別に、JDBCアプリケーションでは、現在のCLOBオブジェクトについてはisTemporaryインスタンス・メソッドを使用し、指定されたCLOBオブジェクトについては、そのCLOBオブジェクトを静的なisTemporaryメソッドに渡して確認できます。これらの2つのメソッドは、listempc.javaで定義されています。
PL/SQL DBMS_LOB.CONVERTTOCLOBプロシージャを使用すると、BLOBインスタンスをCLOBに変換できます。この方法は、CLOBに格納する文字データがバイナリ形式で格納されている場合に役立ちます。このプロシージャのコール時に、バイナリ・データのキャラクタ・セットを指定します。このプロシージャの構文と使用方法の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
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では、メディア・リカバリ中に読取り非一貫性が検出されると、データベースにより一貫性のないブロックがホールとして処理され、BLOBに0が、CLOBに充填文字が格納されます。