Oracle 8i Data Cartridge Developer's Guide Release 2 (8.1.6) Part Number A76937-01 |
|
Working with Multimedia Datatypes, 10 of 10
The Open/Close
functions let you indicate the beginning and end of a series of LOB operations so that large-scale operations, such updating indexes, can be performed once the Close
function is called. This means that once the Open
call is made, the index would not be updated each time the LOB is modified, and that such updating would not resume until the Close
call.
You do not have to wrap all LOB
operations inside the Open/Close
operations, but this function can be very useful for cartridge developers.
For one thing, if the you do not wrap LOB
operations inside an Open/Close
call, then each modification to the LOB
will implicitly open and close the LOB,
thereby firing any triggers. But if do you wrap the LOB
operations inside a pair of Open/Close
operations, then the triggers will not be fired for each LOB
modification. Instead, one trigger will be fired at the time the Close
call is made. LIkewise, extensible indexes will not be updated until the user calls Close
. This means that any extensible indexes on the LOB
are not valid between the Open/Close
calls.
You need to apply this technology carefully since state, such as the changes to the LOB
, will not be saved between the Open
and the Close
operations. Once you have called Open
, Oracle no longer keeps track of what portions of the LOB
value were modified, nor the old and new values of the LOB
that result from any modifications. The LOB
value is still updated directly on a per OCILob*
or DBMS_LOB
operation basis and the usual read consistency mechanism is still in place. Moreover, you may want extensible indexes on the LOB
to be updated as LOB modifications are made because in that case, the extensible LOB
indexes are always valid and may be used at any time.
The API allows you to find out if the LOB
is "open" or not. In all cases openness is associated with the LOB
, not the locator. The locator does not save any information as to whether the LOB
to which it refers is open.
Note that it is an error to commit the transaction before closing all previously opened LOB
s. At transaction rollback time, all LOB
s that are still open will be discarded, which means that they will not be closed thereby firing the triggers).
Only 32 LOBs
may be open at any one time. An error will be returned when the 33rd LOB
is opened. Assigning an already opened locator to another locator does not incur a round trip to the server and does not count as opening a new LOB
(both locators refer to the same LOB
).
It is an error to Open/Close
the same LOB
twice either with different locators or with the same locator. It is an error to close a LOB
that has not been opened.
Assume loc1
is refers to an opened LOB
and is assigned to loc2
. If loc2
is subsequently used to modify the LOB
value, the modification is grouped together with loc1
's modifications (i.e., there's only one entry in the LOB
manager's state, not one per each locator). Once the LOB
is closed (via loc1
or loc2
), the triggers are fired and all updates made to the LOB
through any locator are committed. After the close of the LOB
, if the user tries to use either locator to modify the LOB
, the operation will be performed as Open
/operation/Close
. Note that consistent read is still maintained on a per-locator basis. This discussion is merely showing that the LOB
, not the locator, is opened and closed. No matter how many copies of the locator are made, the triggers for the LOB
are fired only once on the first Close
call.
For example:
open (loc1); loc2 := loc1; write (loc1); write (loc2); open (loc2); /* error because the LOB is already open */ close (loc1); /* triggers are fired and all LOB updates made prior to this statement by any locator are incorporated in the extensible index */ write (loc2); /* implicit open, write, implicit close */
|
![]() Copyright © 1996-2000, Oracle Corporation. All Rights Reserved. |
|