ヘッダーをスキップ
Oracle® Objects for OLE開発者ガイド
11gリリース2 (11.2) for Microsoft Windows
B58887-04
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

OraBLOB、OraCLOBオブジェクト

説明

OO4OのOraBLOBOraCLOBインタフェースは、データベース内のラージ・オブジェクト・データ型BLOBCLOBおよびNCLOBに関する操作を実行するメソッドを提供します。このマニュアルでは、BLOBCLOBおよびNCLOBのデータ型をLOBデータ型とも呼びます。

OO4Oでは、一時BLOBまたはCLOB型の作成をサポートしています。これらの型を操作してSQL文やPL/SQLブロックにバインドしたり、永続LOBにコピーできます。

備考

LOBデータへのアクセスには、ReadおよびCopyToFileメソッドを使用します。

LOBデータの変更には、WriteAppendEraseTrimCopyCopyFromFileおよび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回の読取り/書込み操作でのバッファのサイズを超えます。操作ごとに1回のラウンドトリップを行うのではなく、ピースはストリーム化されます。複数ピース操作を開始するために、まず、PollingAmountプロパティが読取りまたは書込みデータの合計量に設定されます。このとき、Offsetプロパティは、最初のピースの読取り/書込み操作の初期オフセットを指定するように設定されます。オフセットは、最初の読取り/書込み操作の後に自動的に増分され、複数ピース操作が完了するまで再び変更できません。ピース単位の各操作が正常に終了したことをStatusプロパティで確認する必要があり、すべてのピースが読取りまたは書込みされるまで操作を続ける必要があります(これは中止できません)。同じLOBで別の複数ピース読取り/書込み操作を開始するには、PollingAmountプロパティに目的の量を再度設定する必要があります。「例: LOBの複数ピース読取り」を参照してください。

  2. 単一ピースの読取り/書込み操作

    このモードでは、データの読取りと書込みが1回の操作で発生します。このモードは、PollingAmountプロパティを0に設定すると使用可能になります。「例: LOBの単一ピース読取り」を参照してください。

    両方の操作モードとも、Offsetプロパティは、1を基準とします。

仕様により、LOBは、SELECT .. FOR UPDATEINSERTおよびUPDATE文によって開始された複数のトランザクションをまたぐことはできません。これらのSQL文を使用してLOB値を選択または変更すると、現行のトランザクション外では、LOBが無効になります。Oracle Objects for OLEでは、トランザクションは次の方法で開始および終了できます。

  1. Dynaset Edit/Updateメソッド

    EditメソッドはSELECT FOR UPDATE文を実行し、行をロックしてトランザクションを開始します。Updateメソッドはトランザクションを終了します。LOB列の値がEditUpdateのペアの間で変更された場合、OO4Oは、Updateコールの後でLOB列の値を再選択します。この再選択は、ユーザーに対して透過的に実行されます。LOBがOracleオブジェクト・インスタンスの属性またはOracleコレクションの要素である場合、OO4OはLOB値の再選択を実行しません。トランザクションがOraSession/OraDatabaseまたはOraServerオブジェクトで開始され、LOBデータがEditメソッドとUpdateメソッドの間で変更された場合、OO4OはデータベースからLOB値を再選択しません。LOBが無効となるのは、OraSession/OraDatabaseまたはOraServerオブジェクトで開始されたトランザクションをコミットした後です。

    「例: LOBを含むダイナセットとトランザクション」を参照してください。

  2. ExecuteSQLまたはCreateSQLメソッドを介したINSERTまたはUPDATE文の実行

    トランザクションは、INSERTまたはUPDATE文によって開始され、Oracle Objects for OLE(自動コミット)によって暗黙的に終了されます。RETURNING .. INTO句の場合と同様に、文にLOBの出力バインド・パラメータがある場合、ExecuteSQLメソッドまたはCreateSQLメソッドが実行された後にそれは無効になるため、これを避けるには、ユーザーは、OraSessionOraServerまたはOraDatabaseオブジェクトのBeginTrans/CommitTransのペア間でこのような文を実行する必要があります。

    「例: LOBを使用するINSERTまたはUPDATE文とトランザクション」を参照してください。


関連項目:

  • LOBの操作とパフォーマンスに関する問題の詳細は、「例: ラージ・オブジェクト(LOB)の使用」を参照してください。

  • Oracle LOBの詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。


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