説明
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をストアド・プロシージャに渡す方法」を参照してください。