説明
OO4OのOraBLOBとOraCLOBインタフェースは、データベース内のラージ・オブジェクト・データ型BLOB、CLOBおよびNCLOBに関する操作を実行するメソッドを提供します。このマニュアルでは、BLOB、CLOBおよびNCLOBのデータ型をLOBデータ型とも呼びます。
OO4Oでは、一時BLOBまたはCLOB型の作成をサポートしています。これらの型を操作してSQL文やPL/SQLブロックにバインドしたり、永続LOBにコピーできます。
備考
LOBデータへのアクセスには、ReadおよびCopyToFileメソッドを使用します。
LOBデータの変更には、Write、Append、Erase、Trim、Copy、CopyFromFileおよびCopyFromBFileメソッドを使用します。行にあるLOB列のデータを変更するには、その前に行ロックを取得する必要があります。LOB列がOraDynasetオブジェクトのフィールドである場合は、Editメソッドをコールしてロックを取得します。
NULLのLOBで許可されるLOB操作はありません。エラーを回避するには、IsNullプロパティを使用してNULLのLOBを検出します。NULLのLOBで書込み操作を実行するには、最初にLOB列を空の値で初期化しておく必要があります。
LOB列を持つ新しい行を挿入するには、まず、OraFieldまたはOraParameterオブジェクトのValueプロパティにキーワードのEmptyを設定することで、そのLOB列をEmpty値で初期化し、データベースへの変更をコミットします。新しく更新したEmptyのLOBは、使用する前にデータベースから再問合せする必要があります。これは、OraDynasetオブジェクトの場合は自動的に行われます(OraDynasetオブジェクトのLOBフィールドにEmptyが設定され、Updateメソッドがコールされると、後続する書込み操作で使用するために、OO4Oがダイナセット内のEmptyのLOBを自動的に再問合せします)。
LOBの読取りおよび書込み操作には、2つの操作モードがあります。
複数ピースの読取り/書込み操作
このモードでは、読込みまたは書込みデータの合計量が、1回の読取り/書込み操作でのバッファのサイズを超えます。操作ごとに1回のラウンドトリップを行うのではなく、ピースはストリーム化されます。複数ピース操作を開始するために、まず、PollingAmountプロパティが読取りまたは書込みデータの合計量に設定されます。このとき、Offsetプロパティは、最初のピースの読取り/書込み操作の初期オフセットを指定するように設定されます。オフセットは、最初の読取り/書込み操作の後に自動的に増分され、複数ピース操作が完了するまで再び変更できません。ピース単位の各操作が正常に終了したことをStatusプロパティで確認する必要があり、すべてのピースが読取りまたは書込みされるまで操作を続ける必要があります(これは中止できません)。同じLOBで別の複数ピース読取り/書込み操作を開始するには、PollingAmountプロパティに目的の量を再度設定する必要があります。「例: LOBの複数ピース読取り」を参照してください。
単一ピースの読取り/書込み操作
このモードでは、データの読取りと書込みが1回の操作で発生します。このモードは、PollingAmountプロパティを0に設定すると使用可能になります。「例: LOBの単一ピース読取り」を参照してください。
両方の操作モードとも、Offsetプロパティは、1を基準とします。
仕様により、LOBは、SELECT .. FOR UPDATE、INSERTおよびUPDATE文によって開始された複数のトランザクションをまたぐことはできません。これらのSQL文を使用してLOB値を選択または変更すると、現行のトランザクション外では、LOBが無効になります。Oracle Objects for OLEでは、トランザクションは次の方法で開始および終了できます。
Dynaset Edit/Updateメソッド
EditメソッドはSELECT FOR UPDATE文を実行し、行をロックしてトランザクションを開始します。Updateメソッドはトランザクションを終了します。LOB列の値がEditとUpdateのペアの間で変更された場合、OO4Oは、Updateコールの後でLOB列の値を再選択します。この再選択は、ユーザーに対して透過的に実行されます。LOBがOracleオブジェクト・インスタンスの属性またはOracleコレクションの要素である場合、OO4OはLOB値の再選択を実行しません。トランザクションがOraSession/OraDatabaseまたはOraServerオブジェクトで開始され、LOBデータがEditメソッドとUpdateメソッドの間で変更された場合、OO4OはデータベースからLOB値を再選択しません。LOBが無効となるのは、OraSession/OraDatabaseまたはOraServerオブジェクトで開始されたトランザクションをコミットした後です。
「例: LOBを含むダイナセットとトランザクション」を参照してください。
ExecuteSQLまたはCreateSQLメソッドを介したINSERTまたはUPDATE文の実行
トランザクションは、INSERTまたはUPDATE文によって開始され、Oracle Objects for OLE(自動コミット)によって暗黙的に終了されます。RETURNING .. INTO句の場合と同様に、文にLOBの出力バインド・パラメータがある場合、ExecuteSQLメソッドまたはCreateSQLメソッドが実行された後にそれは無効になるため、これを避けるには、ユーザーは、OraSession、OraServerまたはOraDatabaseオブジェクトのBeginTrans/CommitTransのペア間でこのような文を実行する必要があります。
「例: LOBを使用するINSERTまたはUPDATE文とトランザクション」を参照してください。
|
関連項目:
|
プロパティ
メソッド
例
OraLOBとBFILEの例で使用されているスキーマ・オブジェクトについては、「LOBデータ型の例で使用されているスキーマ・オブジェクト」を参照してください。
例: LOB値へのアクセス
Dim OraSession As OraSession
Dim OraDatabase As OraDatabase
Dim OraDynaset As OraDynaset
Dim PartImage as OraBlob
Dim buffer As Variant
'Create the OraSession Object.
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
'Create the OraDatabase Object by opening a connection to Oracle.
Set OraDatabase = OraSession.OpenDatabase("ExampleDb", _
"scott/tiger", 0&)
'execute the select statement
set OraDynaset = OraDatabase.CreateDynaset ("select * from part",0&)
'retrieve photo field from the dynaset
set PartImage = OraDynaset.Fields("part_image").Value
'read the entire LOB column in one piece into the buffer
amount_read = PartImage.Read(buffer, 10)
'use the buffer for internal processing
例: LOB値の変更
Dim OraSession As OraSession
Dim OraDatabase As OraDatabase
Dim OraDynaset As OraDynaset
Dim PartDesc as OraClob
Dim buffer As String
'Create the OraSession Object.
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
'Create the OraDatabase Object by opening a connection to Oracle.
Set OraDatabase = OraSession.OpenDatabase("ExampleDb","scott/tiger", 0&)
'execute the select statement
set OraDynaset = OraDatabase.CreateDynaset ("select * from part",0&)
set PartDesc = OraDynaset.Fields("part_desc").Value
'To get a free file number
FNum = FreeFile
'Open the file for reading
Open "partdesc.dat" For Binary As #FNum
'Allocate buffer to the size of file FNum and read the entire file
buffer = String$(LOF(FNum), 32)
Get #FNum, , buffer
'lock the row for write operation
OraDynaset.Edit
amount_written = PartDesc.Write(buffer)
'commit the operation and release the lock
OraDynaset.Update
Close FNum
例: ダイナセットを使用したLOBの挿入
Dim OraSession As OraSession
Dim OraDatabase As OraDatabase
Dim Part As OraDynaset
Dim PartImage as OraBLOB
Dim ImageChunk() As Byte
Dim amount_written As Long
'Create the OraSession Object.
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
'Create the OraDatabase Object by opening a connection to Oracle.
Set OraDatabase = OraSession.OpenDatabase("ExampleDb", "scott/tiger", 0&)
'Create a Dynaset containing a BLOB and a CLOB column
set part = OraDatabase.CreateDynaset ("select * from part",0)
set PartImage = part.Fields("part_image").Value
'First insert Empty LOB in the part_image column
part.AddNew
part.Fields("part_id").Value = 1234
part.Fields("part_image").Value = Empty
part.Update
'move to the newly added row
Part.MoveLast
'To get a free file number
FNum = FreeFile
'Open the file for reading PartImages
Open "part_picture.gif" For Binary As #FNum
'Re adjust the buffer size to hold entire file data
Redim ImageChunk(LOF(FNum))
'read the entire file and put it into buffer
Get #FNum, , ImageChunk
'call dynaset's Edit method to lock the row
part.Edit
amount_written = OraBlob.Write(ImageChunk)
part.Update
'close the file
Close FNum
例: OraParameterオブジェクトを使用したLOBの挿入
Dim OraSession As OraSession
Dim OraDatabase As OraDatabase
Dim OraBlob As OraBlob
Dim ImageChunk() As Byte
Dim amount_written As Long
'Create the OraSession Object.
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
'Create the OraDatabase Object by opening a connection to Oracle.
Set OraDatabase = OraSession.OpenDatabase("ExampleDb", "scott/tiger", 0&)
Set OraParameters = OraDatabase.Parameters
OraParameters.Add "PartImage", Empty,ORAPARM_OUTPUT
OraParameters("PartImage").ServerType = ORATYPE_BLOB
'BeginTrans needs to be called since LOB locators become
'invalid after the ExecuteSQL call
OraSession.BeginTrans
OraDatabase.ExecuteSQL ("insert into part values (1234,'Oracle Application'," & _
"EMPTY_BLOB(),NULL,NULL) RETURNING part_image INTO :PartImage")
set PartImage = OraDatabase.Parameters("PARTIMAGE").Value
FNum = FreeFile
'Open the file for reading PartImages
Open "part_picture.gif" For Binary As #FNum
'read the file and put it into buffer
Redim ImageChunk(LOF(FNum))
Get #FNum, , ImageChunk
Set OraBlob = OraDatabase.Parameters("PartImage").Value
amount_written = OraBlob.Write(ImageChunk, 10, ORALOB_ONE_PIECE)
' commit the transaction and close the file
OraSession.CommitTrans
Close FNum
例: LOBを含むダイナセットとトランザクション
Dim OraSession As OraSession
Dim OraDatabase As OraDatabase
Dim OraBlob As OraBlob
Dim PartImage as OraBLOB
Dim ImageChunk() As Byte
Dim amount_written As Long
'Create the OraSession Object.
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
'Create the OraDatabase Object by opening a connection to Oracle.
Set OraDatabase = OraSession.OpenDatabase("ExampleDb", "scott/tiger", 0&)
'Create a Dynaset containing a BLOB and a CLOB column
set part = OraDatabase.CreateDynaset ("select * from part " & _
"where part_id = 1234",0)
set PartImage = part.Fields("part_image").Value
'To get a free file number
FNum = FreeFile
'Open the file for reading PartImages
Open "c:\part_picture.gif" For Binary As #FNum
Redim ImageChunk(LOF(FNum))
'read the file and put it into buffer
Get #FNum, , ImageChunk
'starts the transaction on OraSession
OraSession.BeginTrans
'call dynaset's Edit method to lock the row
part.Edit
Set OraBlob = PartImage
amount_written = OraBlob.Write(ImageChunk, 10, ORALOB_ONE_PIECE)
part.Update
'ends the transaction
OraSession.CommitTrans
'the following lines of code will raise error
'LOB locator cannot span transaction'
msgbox Partimage.Size
Close FNum
例: LOBを使用するINSERTまたはUPDATE文とトランザクション
Dim OraSession As OraSession
Dim OraDatabase As OraDatabase
Dim ImageChunk() As Byte
Dim amount_written As Long
'Create the OraSession Object.
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
'Create the OraDatabase Object by opening a connection to Oracle.
Set OraDatabase = OraSession.OpenDatabase("ExampleDb", "scott/tiger", 0&)
Set OraParameters = OraDatabase.Parameters
OraParameters.Add "PartImage", Empty,ORAPARM_OUTPUT
OraParameters("PartImage").ServerType = ORATYPE_BLOB
'Create a Dynaset containing a LOB,column
OraDatabase.ExecuteSQL ("insert into part values (1234,'Oracle Application'," & _
"EMPTY_BLOB(),NULL,NULL) RETURNING part_image INTO :PartImage")
set PartImage = OraDatabase.Parameters("PARTIMAGE").Value
'the following lines of code will raise error
'LOB locator cannot span transaction'
msgbox Partimage.Size
例: CopyToFileメソッドの使用方法
「例: CopyToFileメソッドの使用方法」を参照してください。
例: CopyFromFileメソッドの使用方法
「例: CopyFromFileメソッドの使用方法」を参照してください。
例: LOBの複数ピース読取り
「例: LOBの複数ピース読取り」を参照してください。
例: LOBの単一ピース読取り
「例: LOBの単一ピース読取り」を参照してください。
例: LOBの複数ピース書込み
「例: LOBの複数ピース書込み」を参照してください。
例: LOBの単一ピース書込み
「例: LOBの単一ピース書込み」を参照してください。
例: 一時CLOBをストアド・プロシージャに渡す方法
「例: 一時CLOBをストアド・プロシージャに渡す方法」を参照してください。