ODP.NETは、ラージ・オブジェクト(LOB)データ型にアクセスして操作するための簡単かつ最適な方法を提供します。この項の内容は次のとおりです。
Oracle Databaseは、ラージ・キャラクタ・データ型とラージ・バイナリ・データ型をサポートしています。
CLOB
: キャラクタ・データを4ギガバイト(4GB)まで格納できます。
NCLOB
: Unicode各国語キャラクタ・セット・データを4GBまで格納できます。
BLOB
: 非構造化バイナリ・データを4GBまで格納できます。
BFILE
: 外部ファイルに格納されるバイナリ・データを4GBまで格納できます。
ODP.NETでは、LOBデータを操作するために、OracleBFile
、OracleBlob
およびOracleClob
の3つのLOB用オブジェクトが提供されます。
表3-14は、特定のOracle LOBタイプに使用するのに適したODP.NETオブジェクトを示します。
表3-14 ODP.NET LOBオブジェクト
Oracle LOB型 | ODP.NET LOBオブジェクト |
---|---|
|
|
|
|
|
|
|
|
ODP.NET LOBオブジェクトは、OracleDataReader
で適切な型指定アクセッサをコールするか、適切なバインド・タイプのコマンド実行で、出力パラメータとして取得できます。
ODP.NET LOBオブジェクトはすべて、汎用的なStream
操作を実行するために.NET Stream
クラスから継承されます。LOBデータ(BFILE
タイプを除く)は、Write
などのメソッドを使用することで、ODP.NET LOBオブジェクトを使用して更新できます。読込みおよび書込み操作が実行されている場合、LOBオブジェクトのデータはキャッシュされません。このため、ReadまたはWriteの各要求は、データベース・ラウンドトリップを発生させます。OracleClob
オブジェクトはRead
メソッドをオーバーロードして、CLOB
からデータを読み取る2つの方法を提供します。byte[]
をバッファとして取得するRead
メソッドは、Unicodeバイト配列としてCLOB
データを移入します。char[]
をバッファとして取得するRead
メソッドは、Unicode文字を移入します。
OracleBFile
オブジェクトには拡張機能もあります。OracleBFile
オブジェクトは、データが読み込まれる前に、OpenFile
メソッドを使用して明示的にオープンする必要があります。以前にオープンしたBFILE
をクローズするには、CloseFile
メソッドを使用します。
ODP.NET LOBオブジェクトはすべて接続済のオブジェクトで、存続中は接続している必要があります。LOBオブジェクトに関連付けられた接続がクローズすると、LOBオブジェクトは使用できなくなり、処理が必要になります。
ODP.NET LOBオブジェクトが型指定アクセッサによってOracleDataReader
オブジェクトから取得される場合、Connection
プロパティは、OracleDataReader
オブジェクトで使用される同じOracleConnection
オブジェクトへの参照を使用して設定されます。LOBオブジェクトが出力パラメータとして取得される場合、Connection
プロパティは、OracleCommand
オブジェクトで使用される同じOracleConnection
プロパティへの参照を使用して設定されます。一時LOBを作成するためにODP.NET LOBオブジェクト・コンストラクタを起動させることで、LOBオブジェクトが取得される場合、Connection
プロパティは、コンストラクタで指定されたOracleConnection
オブジェクトへの参照を使用して設定されます。
ODP.NET LOBオブジェクトのConnection
プロパティは読取り専用であり、存続中は変更できません。また、ODP.NET LOBタイプ・オブジェクトは、ODP.NET LOBオブジェクトで参照される同じOracleConnection
のコンテキスト内でのみ使用できます。たとえば、ODP.NET LOBオブジェクトのConnection
プロパティは、ODP.NET LOBオブジェクトがOracleCommand
のパラメータである場合、OracleCommand
オブジェクトと同じ接続を参照する必要があります。それ以外の場合、ODP.NETはコマンドの実行時に例外を発生させます。
BFILE
データおよびBLOB
データは、byte
配列としてDataSet
に格納され、CLOB
データおよびNCLOB
データは、string
として格納されます。他のタイプも同様に、OracleDataAdapter
オブジェクトを使用して、SQLの自動生成にOracleCommandBuilder
を使用することで、LOBデータの変更を入力および更新できます。
Oracle LOB列には、最大4GBのデータを格納できます。LOBデータがDataSet
にフェッチされると、DataSet
がLOB列に保持できるLOBデータの実際の量は、.NET文字列タイプの最大サイズ(2GB)に制限されます。このため、2GBより大きいLOBデータをフェッチする場合、ODP.NET LOBオブジェクトを使用してデータの損失を防ぐ必要があります。
LOB列を更新するには、LOBデータをSQL文、無名PL/SQLブロックまたはストアド・プロシージャのパラメータとしてバインドします。パラメータ値は、NET Frameworkタイプ、ODP.NETタイプまたはODP.NET LOBオブジェクト・タイプとして設定できます。たとえば、.NET文字列データをOracle9i以降のデータベースのLOB列に挿入する場合、そのパラメータをOracleDbType.Varchar2
としてバインドできます。値がOracleClob
オブジェクトに設定されているパラメータの場合、パラメータをOracleDbType.Clob
としてバインドする必要があります。
Oracle BFILE
は更新できないため、OracleBFile
オブジェクトでBFILE
列を更新することはできません。
ODP.NET LOBオブジェクトを使用してLOBデータを更新するには、2つの要件を満たす必要があります。
LOB列を選択する前に、トランザクションを開始する必要があります。
OracleTransaction
Commit
メソッドまたはRollback
メソッドが起動されたときにロックが解除されるように、コマンド実行の前にOracleConnection
でBeginTransaction
メソッドを使用してトランザクションを開始する必要があります。
行ごとに、または結果セット全体の一部として、LOB列が存在する行をロックする必要があります。
結果セット全体のロック
SELECT
文の最後にFOR
UPDATE
句を追加します。コマンドの実行後、結果セット全体がロックされます。
行のロックには、2つのオプションがあります。
OracleDataReader
でOracleDataReader
の型指定アクセッサの1つ(GetOracleClobForUpdate
またはGetOracleBlobForUpdate
)を起動して、現在の行がロックされている間にODP.NET LOBオブジェクトを取得します。
この方法では、結果セットに主キー、一意の列またはROWID
が必要です。OracleDataReader
オブジェクトは行を一意に識別して、ロック用に再選択するためです。
RETURNING
句でLOBを戻すINSERT
またはUPDATE
文を実行します。
一時LOBは、BLOB
、CLOB
およびNCLOB
オブジェクトに対してインスタンス化できます。一時LOBを表すODP.NET LOBオブジェクトをインスタンス化するには、OracleClob
またはOracleBlob
コンストラクタを使用します。
一時ODP.NET LOBオブジェクトは、次の目的に使用できます。
空または空ではないLOBデータを使用して、LOB列を初期化および移入します。
LOBタイプをSQL文、無名PL/SQLブロックまたはストアド・プロシージャへの入力パラメータとして渡します。
CopyTo
操作において、2つのLOBオブジェクト間のデータ送信のソースまたは宛先として機能します。
注意: 一時LOBはトランザクションを認識しません。コミット操作およびロールバック操作は、一時LOBで参照されるデータには影響しません。 |