PK "8Aoa,mimetypeapplication/epub+zipPK"8AiTunesMetadata.plistC artistName Oracle Corporation book-info cover-image-hash 936579276 cover-image-path OEBPS/dcommon/oracle-logo.jpg package-file-hash 316488344 publisher-unique-id E16545-07 unique-id 962618325 genre Oracle Documentation itemName Oracle® Database XStream Guide, 11g Release 2 (11.2) releaseDate 2011-07-29T10:24:20Z year 2011 PKVdHCPK"8AMETA-INF/container.xml PKYuPK"8AOEBPS/xstrm_pt_views.htmv XStream Data Dictionary Views

Part V

XStream Data Dictionary Views

This part contains descriptions of the data dictionary views related to XStream. This part contains the following chapters:

PK̢PK"8AOEBPS/xstrm_dp_views.htm XStream Dynamic Performance (V$) Views

13 XStream Dynamic Performance (V$) Views

This chapter describes the dynamic performance (V$) views related to XStream. In an XStream configuration, an apply process can function as an XStream outbound server or inbound server.

This chapter contains these topics:

V$STREAMS_APPLY_COORDINATOR

V$STREAMS_APPLY_COORDINATOR displays information about each apply process coordinator. The coordinator for an apply process gets transactions from the apply process reader and passes them to apply servers. An apply process coordinator is a subcomponent of an apply process, outbound server, or inbound server.

ColumnData TypeDescription
SIDNUMBERSession ID of the coordinator's session
SERIAL#NUMBERSerial number of the coordinator's session
STATEVARCHAR2(21)State of the coordinator:
  • INITIALIZING - Starting up

  • IDLE - Performing no work

  • APPLYING - Passing transactions to apply servers

  • SHUTTING DOWN CLEANLY - Stopping without an error

  • ABORTING - Stopping because of an apply error

APPLY#NUMBERApply process number

An apply process coordinator is an Oracle background process, prefixed by ap.

APPLY_NAMEVARCHAR2(30)Name of the apply process
TOTAL_APPLIEDNUMBERTotal number of transactions applied by the apply process since the apply process was last started
TOTAL_WAIT_DEPSNUMBERNumber of times since the apply process was last started that an apply server waited to apply a logical change record (LCR) in a transaction until another apply server applied a transaction because of a dependency between the transactions
TOTAL_WAIT_COMMITSNUMBERNumber of times since the apply process was last started that an apply server waited to commit a transaction until another apply server committed a transaction to serialize commits
TOTAL_ADMINNUMBERNumber of administrative jobs issued since the apply process was last started
TOTAL_ASSIGNEDNUMBERNumber of transactions assigned to apply servers since the apply process was last started
TOTAL_RECEIVEDNUMBERTotal number of transactions received by the coordinator process since the apply process was last started
TOTAL_IGNOREDNUMBERNumber of transactions which were received by the coordinator but were ignored because they had been previously applied
TOTAL_ROLLBACKSNUMBERNumber of transactions which were rolled back due to unexpected contention
TOTAL_ERRORSNUMBERNumber of transactions applied by the apply process that resulted in an apply error since the apply process was last started
UNASSIGNED_COMPLETE_TXNSNUMBERTotal number of complete transactions that the coordinator has not assigned to any apply servers
AUTO_TXN_BUFFER_SIZENUMBERCurrent value of transaction buffer size

Transaction buffer size refers to the number of transactions that the apply reader can assemble ahead of apply servers. The apply process periodically adjusts the transaction buffer size.

LWM_TIMEDATETime when the message with the lowest message number was recorded

The creation time of the message with the lowest message number was also recorded at this time.

LWM_MESSAGE_NUMBERNUMBERNumber of the message corresponding to the low-watermark

That is, messages with a commit message number less than or equal to this message number have definitely been applied, but some messages with a higher commit message number also may have been applied.

LWM_MESSAGE_CREATE_TIMEDATEFor captured messages, creation time at the source database of the message corresponding to the low-watermark. For user-enqueued messages, time when the message corresponding to the low-watermark was enqueued into the queue at the local database.
HWM_TIMEDATETime when the message with the highest message number was recorded

The creation time of the message with the highest message number was also recorded at this time.

HWM_MESSAGE_NUMBERNUMBERNumber of the message corresponding to the high-watermark

That is, no messages with a commit message number greater than this message number have been applied.

HWM_MESSAGE_CREATE_TIMEDATEFor captured messages, creation time at the source database of the message corresponding to the high-watermark. For user-enqueued messages, time when the message corresponding to the high-watermark was enqueued into the queue at the local database.
STARTUP_TIMEDATETime when the apply process was last started
ELAPSED_SCHEDULE_TIMENUMBERTime elapsed (in hundredths of a second) scheduling messages since the apply process was last started
ELAPSED_IDLE_TIMENUMBERElapsed idle time
LWM_POSITIONRAW(64)Position of the low-watermark LCR
HWM_POSITIONRAW(64)Position of the high-watermark LCR
PROCESSED_MESSAGE_NUMBERNUMBERMessage number currently processed by the apply coordinator


Note:

The ELAPSED_SCHEDULE_TIME column is only populated if the TIMED_STATISTICS initialization parameter is set to true, or if the STATISTICS_LEVEL initialization parameter is set to TYPICAL or ALL.

V$STREAMS_APPLY_READER

V$STREAMS_APPLY_READER displays information about each apply reader. The apply reader is a process which reads (dequeues) messages from the queue, computes message dependencies, and builds transactions. It passes the transactions on to the coordinator in commit order for assignment to the apply servers. An apply reader is a subcomponent of an apply process, outbound server, or inbound server.

ColumnData TypeDescription
SIDNUMBERSession ID of the reader's session
SERIAL#NUMBERSerial number of the reader's session
APPLY#NUMBERApply process number

An apply process is an Oracle background process prefixed by ap.

APPLY_NAMEVARCHAR2(30)Name of the apply process
STATEVARCHAR2(36)State of the reader:
  • INITIALIZING - Starting up.

  • IDLE - Performing no work.

  • DEQUEUE MESSAGES - Dequeuing messages from the queue.

  • SCHEDULE MESSAGES - Computing dependencies between messages and assembling messages into transactions.

  • SPILLING - Spilling unapplied messages from memory to hard disk.

  • PAUSED - WAITING FOR DDL TO COMPLETE - Waiting for a data definition language (DDL) LCR to be applied.

TOTAL_MESSAGES_DEQUEUEDNUMBERTotal number of messages dequeued since the apply process was last started
TOTAL_MESSAGES_SPILLEDNUMBERNumber of messages spilled by the reader since the apply process was last started
DEQUEUE_TIMEDATETime when the last message was received
DEQUEUED_MESSAGE_NUMBERNUMBERNumber of the last message received
DEQUEUED_MESSAGE_CREATE_TIMEDATEFor captured messages, creation time at the source database of the last message received. For user-enqueued messages, time when the message was enqueued into the queue at the local database.
SGA_USEDNUMBERAmount (in bytes) of SGA memory used by the apply process since it was last started
ELAPSED_DEQUEUE_TIMENUMBERTime elapsed (in hundredths of a second) dequeuing messages since the apply process was last started
ELAPSED_SCHEDULE_TIMENUMBERTime elapsed (in hundredths of a second) scheduling messages since the apply process was last started. Scheduling includes computing dependencies between messages and assembling messages into transactions.
ELAPSED_SPILL_TIMENUMBERElapsed time (in hundredths of a second) spent spilling messages since the apply process was last started
LAST_BROWSE_NUMNUMBERReserved for internal use
OLDEST_SCN_NUMNUMBEROldest SCN
LAST_BROWSE_SEQNUMBERReserved for internal use
LAST_DEQ_SEQNUMBERLast dequeue sequence number
OLDEST_XIDUSNNUMBERTransaction ID undo segment number of the oldest transaction that either has been applied or is being applied
OLDEST_XIDSLTNUMBERTransaction ID slot number of the oldest transaction that either has been applied or is being applied
OLDEST_XIDSQNNUMBERTransaction ID sequence number of the oldest transaction that either has been applied or is being applied
SPILL_LWM_SCNNUMBERSpill low-watermark SCN
PROXY_SIDNUMBERWhen the apply process uses combined capture and apply, the session ID of the propagation receiver that is responsible for direct communication between capture and apply. If the apply process does not use combined capture and apply, then this column is 0.
PROXY_SERIALNUMBERWhen the apply process uses combined capture and apply, the serial number of the propagation receiver that is responsible for direct communication between capture and apply. If the apply process does not use combined capture and apply, then this column is 0.
PROXY_SPIDVARCHAR2(12)When the apply process uses combined capture and apply, the process identification number of the propagation receiver that is responsible for direct communication between capture and apply. If the apply process does not use combined capture and apply, then this column is 0.
CAPTURE_BYTES_RECEIVEDNUMBERWhen the apply process uses combined capture and apply, the number of bytes received by the apply process from the capture process since the apply process last started. If the apply process does not use combined capture and apply, then this column is not populated.
DEQUEUED_POSITIONRAW(64)Dequeued position

This column is populated only for an apply process that is functioning as an XStream inbound server.

LAST_BROWSE_POSITIONRAW(64)Reserved for internal use
OLDEST_POSITIONRAW(64)The earliest position of the transactions currently being dequeued and applied

This column is populated only for an apply process that is functioning as an XStream inbound server.

SPILL_LWM_POSITIONRAW(64)Spill low-watermark position

This column is populated only for an apply process that is functioning as an XStream inbound server.

OLDEST_TRANSACTION_IDVARCHAR2(128)Oldest transaction ID
TOTAL_LCRS_WITH_DEPNUMBERTotal number of LCRs with row-level dependencies since the apply process last started
TOTAL_LCRS_WITH_WMDEPNUMBERTotal number of LCRs with watermark dependencies since the apply process last started

A watermark dependency occurs when an apply process must wait until the apply process's low-watermark reaches a particular threshold.

TOTAL_IN_MEMORY_LCRSNUMBERTotal number of LCRs currently in memory
SGA_ALLOCATEDNUMBERThe total amount of shared memory (in bytes) allocated from the Streams pool for the apply process since the apply process last started


Note:

The ELAPSED_DEQUEUE_TIME and ELAPSED_SCHEDULE_TIME columns are only populated if the TIMED_STATISTICS initialization parameter is set to true, or if the STATISTICS_LEVEL initialization parameter is set to TYPICAL or ALL.

V$STREAMS_APPLY_SERVER

V$STREAMS_APPLY_SERVER displays information about each apply server and its activities. An apply server receives messages from the apply coordinator for an apply process. For each message received, an apply server either applies the message or sends the message to the appropriate apply handler. An apply server is a subcomponent of an apply process, outbound server, or inbound server.

ColumnData TypeDescription
SIDNUMBERSession ID of the apply server's session
SERIAL#NUMBERSerial number of the apply server's session
APPLY#NUMBERApply process number

An apply process is an Oracle background process prefixed by ap.

APPLY_NAMEVARCHAR2(30)Name of the apply process
SERVER_IDNUMBERParallel execution server number of the apply server
STATEVARCHAR2(20)State of the apply server:
  • INITIALIZING - Starting up.

  • IDLE - Performing no work.

  • RECORD LOW-WATERMARK - Performing an administrative job that maintains information about the apply progress, which is used in the ALL_APPLY_PROGRESS and DBA_APPLY_PROGRESS data dictionary views.

  • ADD PARTITION - Performing an administrative job that adds a partition that is used for recording information about in-progress transactions.

  • DROP PARTITION - Performing an administrative job that purges rows that were used to record information about in-progress transactions.

  • EXECUTE TRANSACTION - Applying a transaction.

  • WAIT COMMIT - Waiting to commit a transaction until all other transactions with a lower commit SCN are applied. This state is possible only if the COMMIT_SERIALIZATION apply process parameter is set to a value other than DEPENDENT_TRANSACTIONS and the PARALLELISM apply process parameter is set to a value greater than 1.

  • WAIT DEPENDENCY - Waiting to apply an LCR in a transaction until another transaction, on which it has a dependency, is applied. This state is possible only if the PARALLELISM apply process parameter is set to a value greater than 1.

  • ROLLBACK TRANSACTION - Rolling back a transaction.

  • TRANSACTION CLEANUP - Cleaning up an applied transaction, which includes removing LCRs from the apply process's queue.

  • WAIT FOR CLIENT - Waiting for an XStream client application to request more LCRs.

  • WAIT FOR NEXT CHUNK - Waiting for the next set of LCRs for a large transaction.

XIDUSNNUMBERTransaction ID undo segment number of the transaction currently being applied
XIDSLTNUMBERTransaction ID slot number of the transaction currently being applied
XIDSQNNUMBERTransaction ID sequence number of the transaction currently being applied
COMMITSCNNUMBERCommit SCN of the transaction currently being applied
DEP_XIDUSNNUMBERTransaction ID undo segment number of a transaction on which the transaction being applied by this apply server depends
DEP_XIDSLTNUMBERTransaction ID slot number of a transaction on which the transaction being applied by this apply server depends
DEP_XIDSQNNUMBERTransaction ID sequence number of a transaction on which the transaction being applied by this apply server depends
DEP_COMMITSCNNUMBERCommit SCN of the transaction on which this apply server depends
MESSAGE_SEQUENCENUMBERNumber of the current message being applied by the apply server. This value is reset to 1 at the beginning of each transaction.
TOTAL_ASSIGNEDNUMBERTotal number of transactions assigned to the apply server since the apply process was last started
TOTAL_ADMINNUMBERTotal number of administrative jobs done by the apply server since the apply process was last started. See the STATE information in this view for the types of administrative jobs.
TOTAL_ROLLBACKSNUMBERNumber of transactions assigned to this server that were rolled back
TOTAL_MESSAGES_APPLIEDNUMBERTotal number of messages applied by this apply server since the apply process was last started
APPLY_TIMEDATETime the last message was applied
APPLIED_MESSAGE_NUMBERNUMBERNumber of the last message applied
APPLIED_MESSAGE_CREATE_TIMEDATECreation time at the source database of the last captured message applied. No information about user-enqueued messages is recorded in this column.
ELAPSED_DEQUEUE_TIMENUMBERTime elapsed (in hundredths of a second) dequeuing messages since the apply process was last started
ELAPSED_APPLY_TIMENUMBERTime elapsed (in hundredths of a second) applying messages since the apply process was last started
COMMIT_POSITIONRAW(64)Commit position of the transaction.

This column is populated only for an apply process that is functioning as an XStream outbound server or inbound server.

DEP_COMMIT_POSITIONRAW(64)Commit position of the transaction the slave depends on

This column is populated only for an apply process that is functioning as an XStream inbound server.

LAST_APPLY_POSITIONRAW(64)For inbound servers, the position of the last message applied; for outbound servers, the position of the last message sent to the XStream client application

This column is populated only for an apply process that is functioning as an XStream outbound server or inbound server.

TRANSACTION_IDVARCHAR2(128)Transaction ID that the slave is applying

This column is populated only for an apply process that is functioning as an XStream inbound server.

DEP_TRANSACTION_IDVARCHAR2(128)Transaction ID of the transaction the slave depends on

This column is populated only for an apply process that is functioning as an XStream inbound server.



Note:

  • The ELAPSED_DEQUEUE_TIME and ELAPSED_APPLY_TIME columns are only populated if the TIMED_STATISTICS initialization parameter is set to true, or if the STATISTICS_LEVEL initialization parameter is set to TYPICAL or ALL.

  • The WAIT FOR NEXT CHUNK apply server state is available starting with Oracle Database 11g Release 2 (11.2.0.2).


V$XSTREAM_CAPTURE


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

V$XSTREAM_CAPTURE displays information about each capture process that sends LCRs to an XStream outbound server.


Note:

This view does not display information about capture processes that send LCRs to Oracle Streams apply processes. To view information about such capture processes, query the V$STREAMS_CAPTURE view.

ColumnData TypeDescription
SIDNUMBERSession identifier of the capture process
SERIAL#NUMBERSession serial number of the capture process session
CAPTURE#NUMBERCapture process number

A capture process is an Oracle background process prefixed by cp.

CAPTURE_NAMEVARCHAR2(30)Name of the capture process
LOGMINER_IDNUMBERSession ID of the Oracle LogMiner session associated with the capture process
STARTUP_TIMEDATETime when the capture process was last started
STATEVARCHAR2(551)State of the capture process:
  • INITIALIZING - Starting up.

  • WAITING FOR DICTIONARY REDO - Waiting for redo log files containing the dictionary build related to the first SCN to be added to the capture process session. A capture process cannot begin to scan the redo log files until all of the log files containing the dictionary build have been added.

  • DICTIONARY INITIALIZATION - Processing a dictionary build.

  • MINING (PROCESSED SCN = scn_value) - Mining a dictionary build at the SCN scn_value.

  • LOADING (step X of Y) - Processing information from a dictionary build and currently at step X in a process that involves Y steps, where X and Y are numbers.

  • CAPTURING CHANGES - Scanning the redo log for changes that satisfy the capture process rule sets.

  • WAITING FOR REDO - Waiting for new redo log files to be added to the capture process session. The capture process has finished processing all of the redo log files added to its session. This state is possible if there is no activity at a source database. For a downstream capture process, this state is possible if the capture process is waiting for new log files to be added to its session.

  • EVALUATING RULE - Evaluating a change against a capture process rule set.

  • CREATING LCR - Converting a change into an LCR.

  • ENQUEUING MESSAGE - Enqueuing an LCR that satisfies the capture process rule sets into the capture process queue.

  • PAUSED FOR FLOW CONTROL - Unable to enqueue LCRs either because of low memory or because propagations and outbound servers are consuming messages slower than the capture process is creating them. This state indicates flow control that is used to reduce spilling of captured LCRs when propagation or apply has fallen behind or is unavailable.

  • WAITING FOR THE BUFFERED QUEUE TO SHRINK - Waiting for the buffered queue to change to a smaller size. The buffered queue shrinks when there is a memory limitation or when an administrator reduces its size.

  • WAITING FOR n SUBSCRIBER(S) INITIALIZING - Waiting for outbound servers that receive LCRs from the capture process to start, where n is the number of outbound servers.

  • WAITING FOR TRANSACTION - Waiting for LogMiner to provide more transactions.

  • WAITING FOR INACTIVE DEQUEUERS - Waiting for the capture process's queue subscribers to start. The capture process stops enqueuing LCRs if there are no active subscribers to the queue.

  • SUSPENDED FOR AUTO SPLIT/MERGE - Waiting for a merge operation to complete.

  • SHUTTING DOWN - Stopping.

  • ABORTING - Aborting.

TOTAL_PREFILTER_DISCARDEDNUMBERTotal number of prefiltered messages discarded
TOTAL_PREFILTER_KEPTNUMBERTotal number of prefiltered messages kept
TOTAL_PREFILTER_EVALUATIONSNUMBERTotal number of prefilter evaluations
TOTAL_MESSAGES_CAPTUREDNUMBERTotal number of redo entries passed by LogMiner to the capture process for detailed rule evaluation since the capture process last started. A capture process converts a redo entry into a message and performs detailed rule evaluation on the message when capture process prefiltering cannot discard the change.
CAPTURE_TIMEDATETime when the most recent message was captured
CAPTURE_MESSAGE_NUMBERNUMBERNumber of the most recently captured message
CAPTURE_MESSAGE_CREATE_TIMEDATECreation time of the most recently captured message
TOTAL_MESSAGES_CREATEDNUMBERCount associated with ELAPSED_LCR_TIME to calculate rate
TOTAL_FULL_EVALUATIONSNUMBERCount associated with ELAPSED_RULE_TIME to calculate rate
TOTAL_MESSAGES_ENQUEUEDNUMBERTotal number of messages enqueued since the capture process was last started
ENQUEUE_TIMEDATETime when the last message was enqueued
ENQUEUE_MESSAGE_NUMBERNUMBERNumber of the last enqueued message
ENQUEUE_MESSAGE_CREATE_TIMEDATECreation time of the last enqueued message
AVAILABLE_MESSAGE_NUMBERNUMBERFor local capture, the last redo SCN flushed to the log files. For downstream capture, the last SCN added to LogMiner through the archived redo log files.
AVAILABLE_MESSAGE_CREATE_TIMEDATEFor local capture, the time the SCN was written to the log file. For downstream capture, the time the most recent archived redo log file (containing the most recent SCN) was added to LogMiner.
ELAPSED_CAPTURE_TIMENUMBERElapsed time (in hundredths of a second) scanning for changes in the redo log since the capture process was last started
ELAPSED_RULE_TIMENUMBERElapsed time (in hundredths of a second) evaluating rules since the capture process was last started
ELAPSED_ENQUEUE_TIMENUMBERElapsed time (in hundredths of a second) enqueuing messages since the capture process was last started
ELAPSED_LCR_TIMENUMBERElapsed time (in hundredths of a second) creating LCRs since the capture process was last started
ELAPSED_REDO_WAIT_TIMENUMBERElapsed time (in hundredths of a second) spent by the capture process in the WAITING FOR REDO state
ELAPSED_PAUSE_TIMENUMBERElapsed flow control pause time (in hundredths of a second)
STATE_CHANGED_TIMEDATETime at which the state of the capture process changed
SGA_USEDNUMBERThe total amount of shared memory (in bytes) currently used by the capture process out of the amount allocated (SGA_ALLOCATED)
SGA_ALLOCATEDNUMBERThe total amount of shared memory (in bytes) allocated from the Streams pool for the capture process
BYTES_OF_REDO_MINEDVARCHAR2(64)The total amount of redo data mined (in bytes) since the capture process last started
SESSION_RESTART_SCNVARCHAR2(64)The SCN from which the capture process started mining redo data when it was last started


Note:

The ELAPSED_CAPTURE_TIME, ELAPSED_RULE_TIME, ELAPSED_ENQUEUE_TIME, ELAPSED_LCR_TIME, and ELAPSED_REDO_WAIT_TIME columns are only populated if the TIMED_STATISTICS initialization parameter is set to true, or if the STATISTICS_LEVEL initialization parameter is set to TYPICAL or ALL.

V$XSTREAM_MESSAGE_TRACKING


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

V$XSTREAM_MESSAGE_TRACKING displays information about LCRs tracked through the stream that are processed by XStream components.

You can track an LCR through a stream using one of the following methods:


Note:

This view does not display information about messages flowing in an Oracle Streams configuration. To view information about such message streams, query the V$STREAMS_MESSAGE_TRACKING view.

ColumnData TypeDescription
TRACKING_LABELVARCHAR2(30)User-specified tracking label
TAGRAW(30)First 30 bytes of the tag of the LCR
COMPONENT_NAMEVARCHAR2(30)Name of the component that processed the LCR
COMPONENT_TYPEVARCHAR2(30)Type of the component that processed the LCR
ACTIONVARCHAR2(50)Action performed on the LCR
ACTION_DETAILSVARCHAR2(100)Details of the action
TIMESTAMPTIMESTAMP(9) WITH TIME ZONETime when the action was performed
MESSAGE_CREATION_TIMEDATETime when the message was created
MESSAGE_NUMBERNUMBERSCN of the message
TRACKING_IDRAW(16)Globally unique OID of the LCR
SOURCE_DATABASE_NAMEVARCHAR2(128)Name of the source database
OBJECT_OWNERVARCHAR2(30)Owner of the object
OBJECT_NAMEVARCHAR2(30)Name of the object
XIDVARCHAR2(128)Transaction ID
COMMAND_TYPEVARCHAR2(30)Command type of the LCR
MESSAGE_POSITIONRAW(64)Position of the message

V$XSTREAM_OUTBOUND_SERVER


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

V$XSTREAM_OUTBOUND_SERVER displays statistics about an outbound server. An outbound server sends LCRs to an XStream client application.


Note:

When the COMMITTED_DATA_ONLY column is YES in the V$XSTREAM_OUTBOUND_SERVER view, the V$STREAMS_APPLY_SERVER view provides additional information about the outbound server process, and information about the apply server background processes used by the outbound server.

ColumnData TypeDescription
SIDNUMBERSession ID of the outbound server's session
SERIAL#NUMBERSerial number of the outbound server's session
SPIDVARCHAR2(12)Process identification number of the operating-system process that sends LCRs to the client application
SERVER_NAMEVARCHAR2(30)Name of the outbound server
STARTUP_TIMEDATETime when the client application attached to the outbound server
STATEVARCHAR2(37)State of the outbound server

When the COMMITTED_DATA_ONLY column shows YES, the following states are possible:

  • INITIALIZING - Starting up the outbound server.

  • IDLE - Performing no work because there are no LCRs to send to the XStream client application.

  • GET TRANSACTIONS - Receiving transactions from the outbound server's apply coordinator.

  • SEND TRANSACTION - Sending a transaction to an XStream client application.

  • WAIT FOR NEXT CHUNK - Waiting for the next set of LCRs for a large transaction.

  • TRANSACTION CLEANUP - Cleaning up an applied transaction, which includes removing LCRs from the outbound server's queue.

  • WAIT FOR CLIENT - Waiting for an XStream client application to request more LCRs.

When the COMMITTED_DATA_ONLY column shows NO, the following states are possible:

  • INITIALIZING - Starting up the outbound server.

  • INITIALIZING RULE EVALUATION CONTEXT - Initializing the context to evaluate the outbound server's rules.

  • IDLE - Performing no work because there are no LCRs to send to the XStream client application.

  • BROWSING LCR - Browsing the outbound server's queue for the next LCR.

  • EVALUATING RULES - Evaluating an LCR against a rule set.

  • DEQUEUING LCR - Dequeuing an LCR from the outbound server's queue.

  • SENDING LCR - Sending an LCR to an XStream client application.

  • WAITING FOR CAPTURE TO TERMINATE - Waiting for the capture process to become disabled.

  • SUSPENDED DUE TO A DROPPED SUBSCRIBER - Suspended because a connected subscriber was dropped. For example, a subscriber can be dropped during a split or merge operation.

  • SUSPENDED FOR AUTO SPLIT/MERGE - Suspended because an automatic split or merge operation is being performed.

  • WAITING ON EMPTY QUEUE - Waiting for more LCRs from the capture process.

  • WAITING FOR CLIENT - Waiting for the XStream client application to request more LCRs.

  • WAITING FOR CAPTURE TO INITIALIZE - Waiting for the capture process to finish the data dictionary build.

  • WAITING TO ATTACH TO CAPTURE - Waiting for the outbound server to attach to the capture process.

When a state refers to a capture process, it is the capture process that captures changes for the outbound server. When a state refers to a propagation, it is the outbound server that sends LCRs to the XStream client application.

XIDUSNNUMBERTransaction ID undo segment number of the transaction currently being processed

This column is populated only if the COMMITTED_DATA_ONLY column shows YES. When the COMMITTED_DATA_ONLY column shows NO, this column is NULL.

XIDSLTNUMBERTransaction ID slot number of the transaction currently being processed

This column is populated only if the COMMITTED_DATA_ONLY column shows YES. When the COMMITTED_DATA_ONLY column shows NO, this column is NULL.

XIDSQNNUMBERTransaction ID sequence number of the transaction currently being processed

This column is populated only if the COMMITTED_DATA_ONLY column shows YES. When the COMMITTED_DATA_ONLY column shows NO, this column is NULL.

COMMITSCNNUMBERCommit SCN of the transaction currently being processed

This column is populated only if the COMMITTED_DATA_ONLY column shows YES. When the COMMITTED_DATA_ONLY column shows NO, this column is NULL.

TOTAL_TRANSACTIONS_SENTNUMBERTotal number of transactions sent by the outbound server to the XStream client application since the last time the client application attached to the outbound server

This column is populated only if the COMMITTED_DATA_ONLY column shows YES. When the COMMITTED_DATA_ONLY column shows NO, this column is NULL.

MESSAGE_SEQUENCENUMBERNumber of the current LCR being processed by the outbound server. This value is reset to 1 at the beginning of each transaction.

This column is populated only if the COMMITTED_DATA_ONLY column shows YES. When the COMMITTED_DATA_ONLY column shows NO, this column is NULL.

TOTAL_MESSAGES_SENTNUMBERTotal number of LCRs sent by the outbound server to the XStream client application since the last time the client application attached to the outbound server
SEND_TIMEDATETime the last LCR was sent by the outbound server to the XStream client application
LAST_SENT_MESSAGE_NUMBERNUMBERMessage number of the last LCR sent by the outbound server to the XStream client application
LAST_SENT_MESSAGE_CREATE_TIMEDATECreation time at the source database of the last LCR sent by the outbound server to the client application
ELAPSED_SEND_TIMENUMBERTime elapsed (in hundredths of a second) sending LCRs to the XStream client application since the last time the client application attached to the outbound server
COMMIT_POSITIONRAW(64)Commit position of the transaction currently being processed

This column is populated only if the COMMITTED_DATA_ONLY column shows YES. When the COMMITTED_DATA_ONLY column shows NO, this column is NULL.

LAST_SENT_POSITIONRAW(64)Position of the last LCR sent to the XStream client application

This column is populated only if the COMMITTED_DATA_ONLY column shows YES. When the COMMITTED_DATA_ONLY column shows NO, this column is NULL.

BYTES_SENTNUMBERTotal number of bytes sent by the outbound server to the XStream client application since the last time the client application attached to the outbound server
COMMITTED_DATA_ONLYVARCHAR2(3)YES if the outbound server can send only LCRs in committed transactions to the XStream client application. A committed transaction is an assembled, noninterleaving transaction with no rollbacks.

NO if the outbound server can send LCRs in transactions that have not yet committed to the XStream client application. This mode is for internal Oracle use only.


V$XSTREAM_TRANSACTION


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

V$XSTREAM_TRANSACTION displays information about transactions that are being processed by capture processes, outbound servers, and inbound servers. This view can identify long running transactions and display how many LCRs are being processed in each transaction. This view only contains information about captured LCRs. It does not contain information about user-enqueued LCRs or user messages.

This view only shows information about LCRs that are being processed because they satisfied the rule sets for the component at the time of the query. For capture processes, this view only shows information about changes in transactions that the capture process has converted into LCRs. It does not show information about all the active transactions present in the redo log.

For outbound servers, this view only shows information about LCRs that the outbound server has dequeued. It does not show information about LCRs in the outbound server's queue. For outbound servers, information about a transaction remains in the view until the transaction is sent to the XStream client application.

For inbound servers, information about a transaction remains in the view until the transaction commits or until the entire transaction is rolled back.


Note:

This view does not display information about Oracle Streams transactions. To view information about Oracle Streams transactions, query the V$STREAMS_TRANSACTION view.

ColumnData TypeDescription
COMPONENT_NAMEVARCHAR2(30)Name of the component
COMPONENT_TYPEVARCHAR2(10)Type of component:
  • CAPTURE for a capture process

  • APPLY for the apply reader subcomponent in an outbound server or inbound server

  • PROPAGATION_SENDER for the propagation sender that sends LCRs from a capture process to an outbound server

XIDUSNNUMBERTransaction ID undo segment number of the transaction
XIDSLTNUMBERTransaction ID slot number of the transaction
XIDSQNNUMBERTransaction ID sequence number of the transaction
CUMULATIVE_MESSAGE_COUNTNUMBERNumber of LCRs processed in the transaction. If a component is restarted while the transaction is being processed, then this column shows the number of LCRs processed in the transaction since the component was started.
TOTAL_MESSAGE_COUNTNUMBERTotal number of LCRs processed in the transaction by an outbound server or inbound server. This column does not pertain to capture processes.
FIRST_MESSAGE_TIMEDATETime stamp of the first LCR processed in the transaction. If a capture process is restarted while the transaction is being processed, then this column shows the time stamp of the first LCR processed after the capture process was started.
FIRST_MESSAGE_NUMBERNUMBERSCN of the first message in the transaction. If a capture process is restarted while the transaction is being processed, then this column shows the SCN of the first message processed after the capture process was started.
LAST_MESSAGE_TIMEDATETime stamp of the last LCR processed in the transaction
LAST_MESSAGE_NUMBERNUMBERSCN of the most recent message encountered in the transaction
FIRST_MESSAGE_POSITIONRAW(64)Position of the first message seen by an XStream inbound server

This column is populated only for an apply process that is functioning as an XStream inbound server.

LAST_MESSAGE_POSITIONRAW(64)Position of the last message seen by an XStream inbound server

This column is populated only for an apply process that is functioning as an XStream inbound server.

TRANSACTION_IDVARCHAR2(128)Transaction ID for an XStream inbound server

This column is populated only for an apply process that is functioning as an XStream inbound server.


PK@;*9%PK"8AOEBPS/xstrm_mon.htm Monitoring XStream

6 Monitoring XStream

This chapter provides instructions for monitoring XStream.

This chapter contains these topics:

About Monitoring XStream

This chapter describes monitoring an XStream Out configuration and an XStream In configuration. This chapter provides instructions for querying data dictionary views related to XStream. The queries provide information about XStream components and statistics related to XStream.

The main interface for monitoring XStream database components is SQL*Plus, although you can monitor some aspects of an XStream configuring using Oracle Enterprise Manager. For example, you can view information about capture processes, outbound servers, inbound servers, and rules in Enterprise Manager. Outbound servers and inbound servers appear as apply processes in Enterprise Manager.

This chapter also describes using the Oracle Streams Performance Advisor to monitor an XStream configuration. The Oracle Streams Performance Advisor consists of the DBMS_STREAMS_ADVISOR_ADM package and a collection of data dictionary views. The Oracle Streams Performance Advisor enables you to monitor the topology and performance of an XStream environment.

Monitoring Session Information About XStream Components


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

The query in this section displays the following session information about each XStream component in a database:

This query is especially useful for determining the session information for specific XStream components when there are multiple XStream Out or XStream In components configured in a database.

To display this information for each XStream component in a database: 

  1. Connect to the database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following query:

    COLUMN ACTION HEADING 'XStream Component' FORMAT A30
    COLUMN SID HEADING 'Session ID' FORMAT 99999
    COLUMN SERIAL# HEADING 'Session|Serial|Number' FORMAT 99999999
    COLUMN PROCESS HEADING 'Operating System|Process Number' FORMAT A17
    COLUMN PROCESS_NAME HEADING 'XStream|Process|Number' FORMAT A7
     
    SELECT /*+PARAM('_module_action_old_length',0)*/ ACTION,
           SID,
           SERIAL#,
           PROCESS,
           SUBSTR(PROGRAM,INSTR(PROGRAM,'(')+1,4) PROCESS_NAME
      FROM V$SESSION
      WHERE MODULE ='XStream';
    

Your output for an XStream Out configuration looks similar to the following:

                                            Session                   XStream
                                             Serial Operating System  Process
XStream Component              Session ID    Number Process Number    Number
------------------------------ ---------- --------- ----------------- -------
XOUT - Apply Server                    35        33 16386             TNS
XOUT - Apply Coordinator               41         1 14093             AP01
XOUT - Apply Reader                    43         1 14095             AS01
XOUT - Apply Server                    45         1 14097             AS02
XOUT - Propagation Send/Rcv            47        55 16401             CS01
CAP$_XOUT_1 - Capture                  48         7 16399             CP01

The row that shows TNS for the XStream process number contains information about the session for the XStream client application that is attached to the outbound server.

Your output for an XStream In configuration looks similar to the following:

                                            Session                   XStream
                                             Serial Operating System  Process
XStream Component              Session ID    Number Process Number    Number
------------------------------ ---------- --------- ----------------- -------
XIN - Propagation Receiver             32        21 16386             TNS
XIN - Apply Coordinator                38        23 16414             AP01
XIN - Apply Reader                     40         3 16418             AS01
XIN - Apply Server                     42         1 16420             AS02
XIN - Apply Server                     44         1 16422             AS03
XIN - Apply Server                     46         1 16424             AS04
XIN - Apply Server                     48         1 16426             AS05

The row that shows TNS for the XStream process number contains information about the session for the XStream client application that is attached to the inbound server.


See Also:

Oracle Database Reference for more information about the V$SESSION view

Monitoring XStream Out

This section provides sample queries that you can use to monitor XStream Out.

This section contains these topics:

With XStream Out, an Oracle Streams apply process functions as an outbound server. Therefore, you can also use the data dictionary views for apply processes to monitor outbound servers. In addition, an XStream Out environment includes capture processes and queues, and might include other components, such as propagations, rules, and rule-based transformations.

Displaying General Information About an Outbound Server

You can display the following information for an outbound server by running the query in this section:

  • The outbound server name

  • The name of the connect user for the outbound server

    The connect user is the user who can attach to the outbound server to retrieve the logical change record (LCR) stream. The client application must attach to the outbound server as the specified connect user.

  • The name of the capture user for the capture process that captures changes for the outbound server to process

  • The name of the capture process that captures changes for the outbound server to process

  • The name of the source database for the captured changes

  • The owner of the queue used by the outbound server

  • The name of the queue used by the outbound server

The DBA_XSTREAM_OUTBOUND view contains information about the capture user, the capture process, and the source database in either of the following cases:

  • The outbound server was created using the CREATE_OUTBOUND procedure in the DBMS_XSTREAM_ADM package.

  • The outbound server was created using the ADD_OUTBOUND procedure in the DBMS_XSTREAM_ADM package, and the capture process for the outbound server runs on the same database as the outbound server.

If the outbound server was created using the ADD_OUTBOUND procedure, and the capture process for the outbound server is on a different database, then the DBA_XSTREAM_OUTBOUND view does not contain information about the capture user, the capture process, or the source database.

To display this general information about an outbound server: 

  1. Connect to the database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following query:

    COLUMN SERVER_NAME HEADING 'Outbound|Server|Name' FORMAT A10
    COLUMN CONNECT_USER HEADING 'Connect|User' FORMAT A10
    COLUMN CAPTURE_USER HEADING 'Capture|User' FORMAT A10
    COLUMN CAPTURE_NAME HEADING 'Capture|Process|Name' FORMAT A11
    COLUMN SOURCE_DATABASE HEADING 'Source|Database' FORMAT A11
    COLUMN QUEUE_OWNER HEADING 'Queue|Owner' FORMAT A10
    COLUMN QUEUE_NAME HEADING 'Queue|Name' FORMAT A10
    
    SELECT SERVER_NAME, 
           CONNECT_USER, 
           CAPTURE_USER, 
           CAPTURE_NAME,
           SOURCE_DATABASE,
           QUEUE_OWNER,
           QUEUE_NAME
      FROM DBA_XSTREAM_OUTBOUND;
    

Your output looks similar to the following:

Outbound                         Capture
Server     Connect    Capture    Process     Source      Queue      Queue
Name       User       User       Name        Database    Owner      Name
---------- ---------- ---------- ----------- ----------- ---------- ----------
XOUT       XSTRMADMIN XSTRMADMIN CAP$_XOUT_1 DB.EXAMPLE. XSTRMADMIN Q$_XOUT_2
                                             COM

Displaying Status and Error Information for an Outbound Server

You can monitor an outbound server using the same queries as you use to monitor an Oracle Streams apply process. See Oracle Streams Concepts and Administration for instructions.

The ALL_APPLY and DBA_APPLY views show XStream Out in the PURPOSE column for an apply process that is functioning as an outbound server.

To display detailed information about an outbound server: 

  1. Connect to the database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following query:

    COLUMN APPLY_NAME HEADING 'Apply Name' FORMAT A10
    COLUMN STATUS HEADING 'Status' FORMAT A8
    COLUMN ERROR_NUMBER HEADING 'Error Number' FORMAT 9999999
    COLUMN ERROR_MESSAGE HEADING 'Error Message' FORMAT A40
    
    SELECT APPLY_NAME, 
           STATUS,
           ERROR_NUMBER,
           ERROR_MESSAGE
      FROM DBA_APPLY
      WHERE PURPOSE = 'XStream Out';
    

Your output looks similar to the following:

Apply Name Status   Error Number Error Message
---------- -------- ------------ ----------------------------------------
XOUT       ENABLED

This output shows that XOUT is an apply process that is functioning as an outbound server. Use the instructions in Oracle Streams Concepts and Administration to display detailed information about the outbound server.


See Also:

"ALL_APPLY"

Displaying Information About an Outbound Server's Current Transaction


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

The V$XSTREAM_OUTBOUND_SERVER view contains the following information about the transaction currently being processed by an XStream outbound server:

  • The name of the outbound server

  • The transaction ID of the transaction currently being processed

  • Commit system change number (SCN) of the transaction currently being processed

  • Commit position of the transaction currently being processed

  • The position of the last LCR sent to the XStream client application

  • The message number of the current LCR being processed by the outbound server

Run this query to determine how many LCRs an outbound server has processed in a specific transaction. You can query the TOTAL_MESSAGE_COUNT column in the V$XSTREAM_TRANSACTION view to determine the total number of LCRs in a transaction.

To display information about an outbound server's current transaction: 

  1. Connect to the database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following query:

    COLUMN SERVER_NAME HEADING 'Outbound|Server|Name' FORMAT A10
    COLUMN 'Transaction ID' HEADING 'Transaction|ID' FORMAT A11
    COLUMN COMMITSCN HEADING 'Commit SCN' FORMAT 9999999999999
    COLUMN COMMIT_POSITION HEADING 'Commit Position' FORMAT A15
    COLUMN LAST_SENT_POSITION HEADING 'Last Sent|Position' FORMAT A15
    COLUMN MESSAGE_SEQUENCE HEADING 'Message|Number' FORMAT 999999999
     
    SELECT SERVER_NAME,
           XIDUSN ||'.'|| 
           XIDSLT ||'.'||
           XIDSQN "Transaction ID",
           COMMITSCN,
           COMMIT_POSITION,
           LAST_SENT_POSITION,
           MESSAGE_SEQUENCE
      FROM V$XSTREAM_OUTBOUND_SERVER;
    

Your output looks similar to the following:

Outbound
Server     Transaction                                Last Sent          Message
Name       ID              Commit SCN Commit Position Position            Number
---------- ----------- -------------- --------------- --------------- ----------
XOUT       17.23.59            645856 00000009DAE0000 00000009DAE0000          4
                                      000010000000100 000010000000100
                                      000009DAE000000 000009DAE000000
                                      0010000000101   0010000000101

Note:

The COMMITSCN and COMMIT_POSITION values are populated only if the COMMITTED_DATA_ONLY value is YES in V$XSTREAM_OUTBOUND_SERVER.

Displaying Statistics for an Outbound Server


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

The V$XSTREAM_OUTBOUND_SERVER view contains the following statistics about the database changes processed by an XStream outbound server:

  • The name of the outbound server

  • The number of transactions sent from the outbound server to the XStream client application since the last time the client application attached to the outbound server

  • The number of LCRs sent from the outbound server to the XStream client application since the last time the client application attached to the outbound server

  • The number of megabytes sent from the outbound server to the XStream client application since the last time the client application attached to the outbound server

  • The amount of time the outbound server spent sending LCRs to the XStream client application since the last time the client application attached to the outbound server

  • The message number of the last LCR sent by the outbound server to the XStream client application

  • Creation time at the source database of the last LCR sent by the outbound server to the client application

To display statistics for an outbound server: 

  1. Connect to the database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following query:

    COLUMN SERVER_NAME HEADING 'Outbound|Server|Name' FORMAT A8
    COLUMN TOTAL_TRANSACTIONS_SENT HEADING 'Total|Trans|Sent' FORMAT 9999999
    COLUMN TOTAL_MESSAGES_SENT HEADING 'Total|LCRs|Sent' FORMAT 9999999999
    COLUMN BYTES_SENT HEADING 'Total|MB|Sent' FORMAT 99999999999999
    COLUMN ELAPSED_SEND_TIME HEADING 'Time|Sending|LCRs|(in seconds)' FORMAT 99999999
    COLUMN LAST_SENT_MESSAGE_NUMBER HEADING 'Last|Sent|Message|Number' FORMAT 99999999
    COLUMN LAST_SENT_MESSAGE_CREATE_TIME HEADING 'Last|Sent|Message|Creation|Time' FORMAT A10
     
    SELECT SERVER_NAME,
           TOTAL_TRANSACTIONS_SENT,
           TOTAL_MESSAGES_SENT,
           (BYTES_SENT/1024)/1024 BYTES_SENT,
           (ELAPSED_SEND_TIME/100) ELAPSED_SEND_TIME,
           LAST_SENT_MESSAGE_NUMBER,
           LAST_SENT_MESSAGE_CREATE_TIME
      FROM V$XSTREAM_OUTBOUND_SERVER;
    

Your output looks similar to the following:

                                                                     Last
                                                      Time      Last Sent
Outbound    Total       Total           Total      Sending      Sent Message
Server      Trans        LCRs              MB         LCRs   Message Creation
Name         Sent        Sent            Sent (in seconds)    Number Time
-------- -------- ----------- --------------- ------------ --------- ----------
XOUT         2000      216000              56          291   9381070 4-AUG-10
                                                                     11:03 A.M.

Note:

The TOTAL_TRANSACTIONS_SENT value is populated only if the COMMITTED_DATA_ONLY value is YES in V$XSTREAM_OUTBOUND_SERVER.

Displaying the Processed Low Position for an Outbound Server

For an outbound server, the processed low position is the position below which all transactions have been committed and logged by the client application. The processed low position is important when the outbound server or the client application is restarted.

You can display the following information about the processed low position for an outbound server by running the query in this section:

  • The outbound server name

  • The name of the source database for the captured changes

  • The processed low position, which indicates the low watermark position processed by the client application

  • The time when the processed low position was last updated by the outbound server

To display the processed low position for an outbound server: 

  1. Connect to the database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following query:

    COLUMN SERVER_NAME HEADING 'Outbound|Server|Name' FORMAT A10
    COLUMN SOURCE_DATABASE HEADING 'Source|Database' FORMAT A20
    COLUMN PROCESSED_LOW_POSITION HEADING 'Processed|Low LCR|Position' FORMAT A30
    COLUMN PROCESSED_LOW_TIME HEADING 'Processed|Low|Time' FORMAT A9
    
    SELECT SERVER_NAME,
           SOURCE_DATABASE,
           PROCESSED_LOW_POSITION,
           TO_CHAR(PROCESSED_LOW_TIME,'HH24:MI:SS MM/DD/YY') PROCESSED_LOW_TIME
    FROM DBA_XSTREAM_OUTBOUND_PROGRESS; 
    

Your output looks similar to the following:

Outbound                        Processed                      Processed
Server     Source               Low LCR                        Low
Name       Database             Position                       Time
---------- -------------------- ------------------------------ ---------
XOUT       DB.EXAMPLE.COM       00000008F17A000000000000000000 13:39:01
                                000008F17A000000000000000001   07/15/09

Determining the Process Information for an Outbound Server


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

An outbound server is an Oracle background process. This background process runs only when an XStream client application attaches to the outbound server. The V$XSTREAM_OUTBOUND_SERVER view contains information about this background process.

You can display the following information for an outbound server by running the query in this section:

  • The outbound server name

  • The session ID of the outbound server's session

  • The serial number of the outbound server's session

  • The process identification number of the operating-system process that sends LCRs to the client application

To display the process information for an outbound server: 

  1. Connect to the database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following query:

    COLUMN SERVER_NAME HEADING 'Outbound Server Name' FORMAT A20
    COLUMN SID HEADING 'Session ID' FORMAT 9999999999
    COLUMN SERIAL# HEADING 'Serial Number' FORMAT 9999999999
    COLUMN SPID HEADING 'Operating-System Process' FORMAT A25
    
    SELECT SERVER_NAME, 
           SID, 
           SERIAL#, 
           SPID
      FROM V$XSTREAM_OUTBOUND_SERVER;
    

Your output looks similar to the following:

Outbound Server Name  Session ID Serial Number Operating-System Process
-------------------- ----------- ------------- -------------------------
XOUT                          53           406 25783

Note:

The V$STREAMS_APPLY_SERVER view provides additional information about the outbound server process, and information about the apply server background processes used by the outbound server.

Monitoring XStream In

This section provides sample queries that you can use to monitor XStream In.

This section contains these topics:

With XStream In, an Oracle Streams apply process functions as an inbound server. Therefore, you can also use the data dictionary views for apply processes to monitor inbound servers.

Displaying General Information About an Inbound Server

You can display the following information for an inbound server by running the query in this section:

  • The inbound server name

  • The owner of the queue used by the inbound server

  • The name of the queue used by the inbound server

  • The apply user for the inbound server

To display general information about an inbound server: 

  1. Connect to the database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following query:

    COLUMN SERVER_NAME HEADING 'Inbound Server Name' FORMAT A20
    COLUMN QUEUE_OWNER HEADING 'Queue Owner' FORMAT A15
    COLUMN QUEUE_NAME HEADING 'Queue Name' FORMAT A15
    COLUMN APPLY_USER HEADING 'Apply User' FORMAT A15
     
    SELECT SERVER_NAME, 
           QUEUE_OWNER,
           QUEUE_NAME,
           APPLY_USER
      FROM DBA_XSTREAM_INBOUND;
    

Your output looks similar to the following:

Inbound Server Name  Queue Owner     Queue Name      Apply User
-------------------- --------------- --------------- ---------------
XIN                  XSTRMADMIN      XQUEUE          XSTRMADMIN

Displaying the Status and Error Information for an Inbound Server

You can monitor an inbound server using the same queries that you use to monitor an Oracle Streams apply process. See Oracle Streams Concepts and Administration for instructions.

The ALL_APPLY and DBA_APPLY views show XStream In in the PURPOSE column for an apply process that is functioning as an inbound server.

To display the status of an inbound server: 

  1. Connect to the database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following query:

    COLUMN APPLY_NAME HEADING 'Apply Name' FORMAT A10
    COLUMN STATUS HEADING 'Status' FORMAT A8
    COLUMN ERROR_NUMBER HEADING 'Error Number' FORMAT 9999999
    COLUMN ERROR_MESSAGE HEADING 'Error Message' FORMAT A40
    
    SELECT APPLY_NAME, 
           STATUS,
           ERROR_NUMBER,
           ERROR_MESSAGE
      FROM DBA_APPLY
      WHERE PURPOSE = 'XStream In';
    

Your output looks similar to the following:

Apply Name Status   Error Number Error Message
---------- -------- ------------ ----------------------------------------
XIN        ENABLED

This output shows that XIN is an apply process that is functioning as an inbound server. Use the instructions in Oracle Streams Concepts and Administration to display detailed information about the inbound server.


See Also:

"ALL_APPLY"

Displaying the Position Information for an Inbound Server

For an inbound server, you can view position information by querying the DBA_XSTREAM_INBOUND_PROGRESS view. Specifically, you can display the following position information by running the query in this section:

  • The inbound server name

  • The applied low position for the inbound server

  • The spill position for the inbound server

  • The applied high position for the inbound server

  • The processed low position for the inbound server

To display the position information for an inbound server: 

  1. Connect to the database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following query:

    COLUMN SERVER_NAME HEADING 'Inbound|Server|Name' FORMAT A10
    COLUMN APPLIED_LOW_POSITION HEADING 'Applied Low|Position' FORMAT A15
    COLUMN SPILL_POSITION HEADING 'Spill Position' FORMAT A15
    COLUMN APPLIED_HIGH_POSITION HEADING 'Applied High|Position' FORMAT A15
    COLUMN PROCESSED_LOW_POSITION HEADING 'Processed Low|Position' FORMAT A15
     
    SELECT SERVER_NAME, 
           APPLIED_LOW_POSITION,
           SPILL_POSITION,
           APPLIED_HIGH_POSITION,
           PROCESSED_LOW_POSITION
      FROM DBA_XSTREAM_INBOUND_PROGRESS;
    

Your output looks similar to the following:

Inbound
Server     Applied Low                     Applied High    Processed Low
Name       Position        Spill Position  Position        Position
---------- --------------- --------------- --------------- ---------------
XIN        C10A            C11D            C10A            C11D

The values of the positions shown in the output were set by the client application that attaches to the inbound server. However, the inbound server determines which values are the current applied low position, spill position, applied high position, and processed low position.

Monitoring XStream Rules

The ALL_XSTREAM_RULES and DBA_XSTREAM_RULES views contain information about the rules used by outbound servers and inbound servers. If an outbound server was created using the CREATE_OUTBOUND procedure in the DBMS_XSTREAM_ADM package, then these views also contain information about the rules used by the capture process that sends changes to the outbound server. However, if an outbound server was created using the ADD_OUTBOUND procedure, then these views do not contain information about the capture process rules. Also, these views do not contain information about the rules used by any propagation in the stream from a capture process to an outbound server.

To display information about the rules used by XStream components: 

  1. Connect to the database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following query:

    COLUMN STREAMS_NAME HEADING 'Oracle|Streams|Name' FORMAT A12
    COLUMN STREAMS_TYPE HEADING 'Oracle|Streams|Type' FORMAT A11
    COLUMN RULE_NAME HEADING 'Rule|Name' FORMAT A10
    COLUMN RULE_SET_TYPE HEADING 'Rule Set|Type' FORMAT A8
    COLUMN STREAMS_RULE_TYPE HEADING 'Oracle|Streams|Rule|Level' FORMAT A7
    COLUMN SCHEMA_NAME HEADING 'Schema|Name' FORMAT A6
    COLUMN OBJECT_NAME HEADING 'Object|Name' FORMAT A11
    COLUMN RULE_TYPE HEADING 'Rule|Type' FORMAT A4
    
    SELECT STREAMS_NAME, 
           STREAMS_TYPE,
           RULE_NAME,
           RULE_SET_TYPE,
           STREAMS_RULE_TYPE,
           SCHEMA_NAME,
           OBJECT_NAME,
           RULE_TYPE
      FROM DBA_XSTREAM_RULES;
    

Your output looks similar to the following:

Oracle       Oracle                          Streams
Streams      Streams     Rule       Rule Set Rule    Schema Object      Rule
Name         Type        Name       Type     Level   Name   Name        Type
------------ ----------- ---------- -------- ------- ------ ----------- ----
CAP$_XOUT_49 CAPTURE     DB52       POSITIVE GLOBAL                     DML
CAP$_XOUT_49 CAPTURE     DB53       POSITIVE GLOBAL                     DDL
XOUT         APPLY       DB55       POSITIVE GLOBAL                     DML
XOUT         APPLY       DB56       POSITIVE GLOBAL                     DDL

Notice that the STREAMS_TYPE is APPLY even though the rules are in the positive rule set for the outbound server xout. You can determine the purpose of an apply process by querying the PURPOSE column in the DBA_APPLY view.

To view information about the rules used by all components, including capture processes, propagations, apply processes, outbound servers, and inbound servers, you can query the ALL_STREAMS_RULES and DBA_STREAMS_RULES views. See Oracle Streams Concepts and Administration for sample queries that enable you to monitor rules.

XStream and the Oracle Streams Performance Advisor

The Oracle Streams Performance Advisor consists of the DBMS_STREAMS_ADVISOR_ADM PL/SQL package and a collection of data dictionary views. The Oracle Streams Performance Advisor enables you to monitor the topology and performance of an XStream environment. The XStream topology includes information about the components in an XStream environment, the links between the components, and the way information flows from capture to consumption. The Oracle Streams Performance Advisor also provides information about how Oracle Streams components are performing.

Apply processes function as XStream outbound servers and inbound servers. In general, the Oracle Streams Performance Advisor works the same way for an Oracle Streams environment with apply processes and an XStream environment with outbound servers or inbound servers. This section describes important considerations about using the Oracle Streams Performance Advisor in an XStream environment.

This section contains these topics:


See Also:

Oracle Streams Concepts and Administration for detailed information about using the Oracle Streams Performance Advisor

XStream Components

The Oracle Streams Performance Advisor tracks the following types of components in an XStream environment:

  • QUEUE

  • CAPTURE

  • PROPAGATION SENDER

  • PROPAGATION RECEIVER

  • APPLY

The preceding types are the same in an Oracle Streams environment and an XStream environment, except for APPLY. The APPLY component type can be an XStream outbound server or inbound server.

The following subcomponent types are possible for apply processes, outbound servers, and inbound servers:

  • PROPAGATION SENDER+RECEIVER for sending LCRs from a capture process directly to an apply process or outbound server in a combined capture and apply optimization

  • APPLY READER for a reader server

  • APPLY COORDINATOR for a coordinator process

  • APPLY SERVER for an apply server

In addition, the Oracle Streams Performance Advisor identifies a bottleneck component as the busiest component or the component with the least amount of idle time. In an XStream configuration, the XStream client application might be the bottleneck when EXTERNAL appears in the ACTION_NAME column of the DBA_STREAMS_TP_PATH_BOTTLENECK view.

Topology and Stream Paths

In the Oracle Streams topology, a stream path is a flow of messages from a source to a destination. A stream path begins where a capture process, synchronous capture, or application enqueues messages into a queue. A stream path ends where an apply process, outbound server, or inbound server dequeues the messages. The stream path might flow through multiple queues and propagations before it reaches an apply process, outbound server, or inbound server. Therefore, a single stream path can consist of multiple source/destination component pairs before it reaches last component.

The Oracle Streams topology only gathers information about a stream path if the stream path ends with an apply process, an outbound server, or an inbound server. The Oracle Streams topology does not track stream paths that end when a messaging client or an application that dequeues messages.

XStream and Component-Level Statistics

The Oracle Streams Performance Advisor tracks the following component-level statistics:

  • The MESSAGE APPLY RATE is the average number of messages applied each second by the apply process, outbound server, or inbound server.

  • The TRANSACTION APPLY RATE is the average number of transactions applied by the apply process, outbound server, or inbound server each second. Transactions typically include multiple messages.

An LCR can be applied in one of the following ways:

  • An apply process or inbound server makes the change encapsulated in the LCR to a database object.

  • An apply process or inbound server passes the LCR to an apply handler.

  • If the LCR raises an error, then an apply process or inbound server sends the LCR to the error queue.

  • An outbound server passes the LCR to an XStream client application. If the LCR raises an error, then the outbound server also reports the error to the client application.

Also, the Oracle Streams Performance Advisor tracks the LATENCY component-level statistics. LATENCY is defined in the following ways:

  • For apply processes, the LATENCY is the amount of time between when the message was created at a source database and when the message was applied by the apply process at the destination database.

  • For outbound servers, the LATENCY is amount of time between when the message was created at a source database and when the message was sent to the XStream client application.

  • For inbound servers, the LATENCY is amount of time between when the message was created by the XStream client application and when the message was applied by the apply process.

When a capture process creates an LCR, the message creation time is the time when the redo entry for the database change was recorded. When an XStream client application creates an LCR, the message creation time is the time when the LCR was constructed.


See Also:

Oracle Streams Concepts and Administration for more information about component-level statistics

The UTL_SPADV Package

The UTL_SPADV package provides subprograms to collect and analyze statistics for the XStream components in a distributed database environment. The package uses the Oracle Streams Performance Advisor to gather statistics, and the output is formatted so that it can be imported into a spreadsheet easily and analyzed.

The UTL_SPADV package works the same way for an Oracle Streams environment with apply processes and an XStream environment with outbound servers or inbound servers. However, there are some differences in the output for the SHOW_STATS procedure. This section describes the differences between the output for apply processes and the output for XStream outbound servers and inbound servers.


Note:

The rest of this section assumes that you are familiar with the UTL_SPADV package and the SHOW_STATS output for apply processes. See Oracle Streams Concepts and Administration and Oracle Database PL/SQL Packages and Types Reference for detailed information about using the UTL_SPADV package.

The following sections describe the output for the SHOW_STATS procedure for outbound servers and inbound servers:

Sample Output When an Outbound Server Is the Last Component in a Path

The following is sample output for when an outbound server is the last component in a path:

OUTPUT                                                    
PATH 1 RUN_ID 2 RUN_TIME 2009-MAY-15 12:20:55 CCA Y
|<C> CAP$_XOUT_1 2733 2730 3392 LMR 8.3% 91.7% 0% "" LMP (1) 8.3% 91.7% 0% ""
LMB 8.3% 91.7% 0% "" CAP 8.3% 91.7% 0% "" |<Q> "XSTRMADMIN"."Q$_XOUT_2" 2730 0.01
4109 |<A> XOUT 2329 2.73 0 -1 PS+PR 8.3% 91.7% 0% "" APR 8.3% 91.7% 0% "" APC
100% 0% 0% "" APS (1) 8.3% 83.3% 8.3% "" |<B> "EXTERNAL"
.
.
.

Note:

This output is for illustrative purposes only. Actual performance characteristics vary depending on individual configurations and conditions.

In this output, the A component is the outbound server XOUT. The output for when an outbound server is the last component in a path is similar to the output for when an apply process is the last component in a path. However, the apply server (APS) is not the last component because the outbound server connects to a client application. Statistics are not collected for the client application.

In an XStream Out configuration, the output can indicate flow control for the network because "SQL*Net more data to client" for an apply server is considered as a flow control event. If the output indicates flow control for an apply server, then either the network or the client application is considered the bottleneck component. In the previous output, EXTERNAL indicates that either the network or the client application is the bottleneck.

Other than these differences, you can interpret the statistics in the same way that you would for a path that ends with an apply process. Use the legend and the abbreviations to determine the statistics in the output.

Sample Output When an Inbound Server Is the Last Component in a Path

The following is sample output for when an inbound server is the last component in a path:

OUTPUT                                                    
PATH 1 RUN_ID 2 RUN_TIME 2009-MAY-16 10:11:38 CCA N
|<PR> "clientcap"=> 75% 0% 8.3% "CPU + Wait for CPU" |<Q> "XSTRMADMIN"."QUEUE2"  467 0.01 1 
|<A> XIN 476 4.71 0 APR 100% 0% 0% "" APC 100% 0% 0% "" APS (4) 366.7% 0% 33.3% "CPU + Wait for CPU" 
|<B> "EXTERNAL"
.
.
.

Note:

This output is for illustrative purposes only. Actual performance characteristics vary depending on individual configurations and conditions.

In this output, the A component is the inbound server XIN. When an inbound server is the last component in a path, the XStream client application connects to the inbound server, and the inbound server applies the changes in the LCRs. The client application is not shown in the output.

The propagation receiver receives the LCRs from the client application. So, the propagation receiver is the first component shown in the output. In the previous sample output, the propagation receiver is named clientcap. In this case, clientcap is the source name given by the client application when it attaches to the inbound server.

If the propagation receiver is idle for a significant percentage of time, then either the network or the client application is considered a bottleneck component. In the previous output, EXTERNAL indicates that either the network or the client application is the bottleneck.

Other than these differences, you can interpret the statistics in the same way that you would for a path that ends with an apply process. Use the legend and the abbreviations to determine the statistics in the output.

PKG:PK"8AOEBPS/cover.htmO Cover

Oracle Corporation

PK[pTOPK"8AOEBPS/xstrm_config.htm Configuring XStream

4 Configuring XStream

This chapter describes configuring the Oracle Database components that are used by XStream. This chapter also includes sample client applications that communicate with an XStream outbound server and inbound server.

This chapter contains these topics:

Preparing for XStream

This section describes preparing for an XStream configuration.

This section contains the following topics:

Granting Privileges for the XStream Administrator

An XStream administrator configures and manages XStream components in an XStream Out or XStream In environment. This section describes configuring an XStream administrator by granting a user the appropriate privileges. You must configure an XStream administrator in each Oracle database included in the XStream configuration.

Prerequisites

Before configuring an XStream administrator, ensure that the following prerequisites are met:

  • Ensure that you can log in to each database in the XStream configuration as an administrative user who can create users, grant privileges, and create tablespaces.

  • Identify a user who will be the XStream administrator. Either create a new user with the appropriate privileges or grant these privileges to an existing user.

    Do not use the SYS or SYSTEM user as an XStream administrator, and ensure that the XStream administrator does not use the SYSTEM tablespace as its default tablespace.

  • If a new tablespace is required for the XStream administrator, then ensure that there is enough disk space on each computer system in the XStream configuration for the tablespace. The recommended size of the tablespace is 25 MB.

Assumptions

This section makes the following assumptions:

  • The username of the XStream administrator is xstrmadmin.

  • The tablespace used by the XStream administrator is xstream_tbs.

To configure an XStream administrator: 

  1. In SQL*Plus, connect as an administrative user who can create users, grant privileges, and create tablespaces. Remain connected as this administrative user for all subsequent steps.


    See Also:

    Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus

  2. Either create a tablespace for the XStream administrator or use an existing tablespace.

    This tablespace stores any objects created in the XStream administrator's schema, including any spillover of messages from the buffered queues owned by the schema.

    For example, the following statement creates a new tablespace for the XStream administrator:

    CREATE TABLESPACE xstream_tbs DATAFILE '/usr/oracle/dbs/xstream_tbs.dbf' 
      SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
    
  3. Create a new user to act as the XStream administrator or identify an existing user.

    For example, to create a user named xstrmadmin and specify that this user uses the xstream_tbs tablespace, run the following statement:

    CREATE USER xstrmadmin IDENTIFIED BY password 
      DEFAULT TABLESPACE xstream_tbs
      QUOTA UNLIMITED ON xstream_tbs;
    

    Note:

    Enter an appropriate password for the administrative user.


    See Also:

    Oracle Database Security Guide for guidelines about choosing passwords

  4. Grant the Oracle Streams administrator the DBA role:

    GRANT DBA TO xstrmadmin;
    

    Note:

    The DBA role is required for a user to create or alter outbound servers, inbound servers, capture processes, synchronous captures, and apply processes. When the user does not need to perform these tasks, the DBA role can be revoked from the user.

  5. Run the GRANT_ADMIN_PRIVILEGE procedure in the DBMS_XSTREAM_AUTH package.

    A user must have explicit EXECUTE privilege on a package to execute a subprogram in the package inside of a user-created subprogram, and a user must have explicit SELECT privilege on a data dictionary view to query the view inside of a user-created subprogram. These privileges cannot be granted through a role. You can run the GRANT_ADMIN_PRIVILEGE procedure to grant such privileges to the XStream administrator, or you can grant them directly.

    Depending on the parameter settings for the GRANT_ADMIN_PRIVILEGE procedure, it either grants the privileges for an XStream administrator directly, or it generates a script that you can edit and then run to grant these privileges.


    Note:

    Starting with Oracle Database 11g Release 2 (11.2.0.2), the DBMS_XSTREAM_AUTH package is available.

    Use the GRANT_ADMIN_PRIVILEGE procedure to grant privileges directly:

    Run the following procedure:

    BEGIN
       DBMS_XSTREAM_AUTH.GRANT_ADMIN_PRIVILEGE(
          grantee          => 'xstrmadmin',    
          grant_privileges => TRUE);
    END;
    /
    

    Use the GRANT_ADMIN_PRIVILEGE procedure to generate a script:

    Complete the following steps:

    1. Use the SQL statement CREATE DIRECTORY to create a directory object for the directory into which you want to generate the script. A directory object is similar to an alias for the directory. For example, to create a directory object called xstrm_dir for the /usr/admin directory on your computer system, run the following procedure:

      CREATE DIRECTORY xstrm_dir AS '/usr/admin';
      
    2. Run the GRANT_ADMIN_PRIVILEGE procedure to generate a script named grant_xstrm_privs.sql and place this script in the /usr/admin directory on your computer system:

      BEGIN
         DBMS_XSTREAM_AUTH.GRANT_ADMIN_PRIVILEGE(
            grantee          => 'xstrmadmin',    
            grant_privileges => FALSE,
            file_name        => 'grant_xstrm_privs.sql',
            directory_name   => 'xstrm_dir');
      END;
      /
      

      Notice that the grant_privileges parameter is set to FALSE so that the procedure does not grant the privileges directly. Also, notice that the directory object created in Step a is specified for the directory_name parameter.

    3. Edit the generated script if necessary and save your changes.

    4. Execute the script in SQL*Plus:

      SET ECHO ON
      SPOOL grant_xstrm_privs.out
      @/usr/admin/grant_xstrm_privs.sql
      SPOOL OFF
      
    5. Check the spool file to ensure that all of the grants executed successfully. If there are errors, then edit the script to correct the errors and rerun it.

  6. If necessary, grant the following additional privileges:

    • If you plan to use Oracle Enterprise Manager to manage databases with XStream components, then configure the XStream administrator to be a Database Control administrator. Doing so grants additional privileges required by Oracle Enterprise Manager, such as the privileges required to run Oracle Enterprise Manager jobs. See Oracle Database 2 Day DBA for instructions.

    • Grant the privileges for a remote XStream administrator to perform actions in the local database. Grant these privileges using the GRANT_REMOTE_ADMIN_ACCESS procedure in the DBMS_XSTREAM_AUTH package. Grant this privilege if a remote XStream administrator will use a database link that connects to the local XStream administrator to perform administrative actions. Specifically, grant these privileges if either of the following conditions are true:

      • You plan to configure a downstream capture process at a remote downstream database that captures changes originating at the local source database, and the downstream capture process will use a database link to perform administrative actions at the source database.

      • You plan to use a remote XStream administrator to set the instantiation system change number (SCN) values for replicated database objects at the local database.

    • If no apply user is specified for an inbound server, then grant the XStream administrator the necessary privileges to perform DML and DDL changes on the apply objects owned by other users. If an apply user is specified, then the apply user must have these privileges. These privileges can be granted directly or through a role.

    • If no apply user is specified for an inbound server, then grant the XStream administrator EXECUTE privilege on any PL/SQL subprogram owned by another user that is executed by an inbound server. These subprograms can be used in apply handlers or error handlers. If an apply user is specified, then the apply user must have these privileges. These privileges must be granted directly. They cannot be granted through a role.

    • Grant the XStream administrator EXECUTE privilege on any PL/SQL function owned by another user that is specified in a custom rule-based transformation for a rule used by a capture process, synchronous capture, propagation, outbound server, or inbound server. For a capture process or synchronous capture, if a capture user is specified, then the capture user must have these privileges. For an inbound server, if an apply user is specified, then the apply user must have these privileges. These privileges must be granted directly. They cannot be granted through a role.

    • Grant the XStream administrator privileges to alter database objects where appropriate. For example, if the XStream administrator must create a supplemental log group for a table in another schema, then the XStream administrator must have the necessary privileges to alter the table. These privileges can be granted directly or through a role.

    • If the XStream administrator does not own the queue used by a capture process, synchronous capture, propagation, outbound server, or inbound server, and is not specified as the queue user for the queue when the queue is created, then the XStream administrator must be configured as a secure queue user of the queue if you want the XStream administrator to be able to enqueue messages into or dequeue messages from the queue. The XStream administrator might also need ENQUEUE or DEQUEUE privileges on the queue, or both. See Oracle Streams Concepts and Administration for information about managing queues.

    • Grant the XStream administrator EXECUTE privilege on any object types that the XStream administrator might need to access. These privileges can be granted directly or through a role.

    • If the XStream administrator will use Data Pump to perform export and import operations on database objects in other schemas during an instantiation, then grant the EXP_FULL_DATABASE and IMP_FULL_DATABASE roles to the XStream administrator.

    • If you are using Oracle Database Vault, then the following additional privileges are required:

      • The XStream administrator must be granted the DV_STREAMS_ADMIN role to perform the following tasks: create a capture process, create an outbound server, and modify the capture user for a capture process. When the XStream administrator is not performing these tasks, you can revoke DV_STREAMS_ADMIN role from the XStream administrator.

      • The apply user for an inbound server must be authorized to apply changes to realms that include replicated database objects. The replicated database objects are the objects to which the inbound server applies changes.

        To authorize an apply user for a realm, run the DBMS_MACADM.ADD_AUTH_TO_REALM procedure and specify the realm and the apply user. For example, to authorize apply user xstrmadmin for the sales realm, run the following procedure:

        BEGIN
         DBMS_MACADM.ADD_AUTH_TO_REALM(
          realm_name  => 'sales', 
          grantee     => 'xstrmadmin'); 
        END;
        /
        

      In addition, the user who performs the following actions must be granted the BECOME USER system privilege:

      • Creates or alters a capture process

      • Creates or alters an outbound server

      • Creates or alters an inbound server

      Granting the BECOME USER system privilege to the user who performs these actions is not required if Oracle Database Vault is not installed. You can revoke the BECOME USER system privilege from the user after the completing one of these actions, if necessary.

      See Oracle Database Vault Administrator's Guide.

  7. Repeat all of the previous steps at each Oracle database in the environment that will use XStream.

Preparing for XStream Out

This section describes the decisions to make and the tasks to complete to prepare for an XStream Out configuration.

Decide How to Configure XStream

When you configure XStream Out, you must configure XStream components to capture database changes and send these changes to the outbound server in the form of logical change records (LCRs). These components include a capture process and at least one queue. The capture process can be a local capture process or a downstream capture process. For some configurations, you must also configure a propagation.

Local capture means that a capture process runs on the source database. Downstream capture means that a capture process runs on a database other than the source database. The source database is the database where the changes were generated. The primary reason to use downstream capture is to reduce the load on the source database, thereby improving its performance. The primary reason to use a local capture is because it is easier to configure and maintain.

The database that captures changes made to the source database is called the capture database. One of the following databases can be the capture database:

  • Source database (local capture)

  • Destination database (downstream capture)

  • A third database (downstream capture)

If the database running the outbound server is not the capture database, then a propagation sends changes from the capture database to the database running the outbound server. If the database running the outbound server is the capture database, then this propagation between databases is not needed because the capture process and outbound server use the same queue.

You can configure the components in the following ways:

  • Local capture and outbound server in the same database: The database objects, capture process, and outbound server are all in the same database. This configuration is the easiest to configure and maintain because all of the components are contained in one database. See Figure 4-1 for an overview of this configuration.

  • Local capture and outbound server in different databases: The database objects and capture process are in one database, and the outbound server is in another database. A propagation sends LCRs from the source database to the outbound server database. This configuration is best when you want easy configuration and maintenance and when you want to optimize the performance of the outbound server database. See Figure 4-2 for an overview of this configuration.

  • Downstream capture and outbound server in the same database: The database objects are in one database, and the capture process and outbound server are in another database. This configuration is best when you want to optimize the performance of the database with the database objects and want to offload change capture to another database. With this configuration, most of the components run on the database with the outbound server. See Figure 4-3 for an overview of this configuration.

  • Downstream capture and outbound server in different databases: The database objects are in one database, the outbound server is in another database, and the capture process is in a third database. This configuration is best when you want to optimize the performance of both the database with the database objects and the database with the outbound server. With this configuration, the capture process runs on a third database, and a propagation sends LCRs from the capture database to the outbound server database. See Figure 4-4 for an overview of this configuration.

The following figures illustrate these different configurations.

Figure 4-1 Local Capture and Outbound Server in the Same Database

Description of Figure 4-1 follows
Description of "Figure 4-1 Local Capture and Outbound Server in the Same Database"

Figure 4-2 Local Capture and Outbound Server in Different Databases

Description of Figure 4-2 follows
Description of "Figure 4-2 Local Capture and Outbound Server in Different Databases"

Figure 4-3 Downstream Capture and Outbound Server in the Same Database

Description of Figure 4-3 follows
Description of "Figure 4-3 Downstream Capture and Outbound Server in the Same Database"

Figure 4-4 Downstream Capture and Outbound Server in Different Databases

Description of Figure 4-4 follows
Description of "Figure 4-4 Downstream Capture and Outbound Server in Different Databases"

If you decide to configure a downstream capture process, then you must decide which type of downstream capture process you want to configure. The following types are available:

  • A real-time downstream capture process configuration means that redo transport services use the log writer process (LGWR) at the source database to send redo data to the downstream database, and a remote file server process (RFS) at the downstream database receives the redo data over the network and stores the redo data in the standby redo log.

  • An archived-log downstream capture process configuration means that archived redo log files from the source database are copied to the downstream database, and the capture process captures changes in these archived redo log files. These log files can be transferred automatically using redo transport services, or they can be transferred manually using a method such as FTP.

The advantage of real-time downstream capture over archived-log downstream capture is that real-time downstream capture reduces the amount of time required to capture changes made to the source database. The time is reduced because the real-time downstream capture process does not need to wait for the redo log file to be archived before it can capture changes from it. You can configure multiple real-time downstream capture processes that capture changes from the same source database, but you cannot configure real-time downstream capture for multiple source databases at one downstream database.

The advantage of archived-log downstream capture over real-time downstream capture is that archived-log downstream capture allows downstream capture processes for multiple source databases at a downstream database. You can copy redo log files from multiple source databases to a single downstream database and configure multiple archived-log downstream capture processes to capture changes in these redo log files.

Prerequisites for Configuring XStream Out

Preparing for an XStream Out outbound server is similar to preparing for an Oracle Streams replication environment. The components used in an Oracle Streams replication environment to capture changes and send them to an apply process are the same components used to capture changes and send them to an outbound server. These components include a capture process and one or more queues. If the capture process runs on a different database than the outbound server, then a propagation is also required.

Several of the tasks described in this section are described in more detail in Oracle Streams Replication Administrator's Guide. This section provides an overview of each task and specific information about completing the task for an XStream Out configuration.

Ensure that the following prerequisites are met before configuring XStream Out:

Configure an XStream Administrator on All Databases

To configure and manage an XStream Out configuration, create an XStream administrator on each Oracle database that is involved in the XStream Out configuration.

If Required, Configure Network Connectivity and Database Links

Network connectivity and database links are not required when all of the components run on the same database. These components include the capture process, queue, and outbound server.

You must configure network connectivity and database links if you decided to configure XStream in either of the following ways:

  • The capture process and the outbound server will run on different databases.

  • Downstream capture will be used.

See "Decide How to Configure XStream" for more information about these decisions.

If network connectivity is required, then configure your network and Oracle Net so that the databases can communicate with each other.

The following database links are required:

  • When the capture process runs on a different database from the outbound server, create a database link from the capture database to the outbound server database. A propagation uses this database link to send changes from the capture database to the outbound server database.

  • When you use downstream capture, create a database link from the capture database to the source database. The source database is the database that generates the redo data that the capture process uses to capture changes. The capture process uses this database link to perform administrative tasks at the source database.

The name of each database link must match the global name of the destination database, and each database link should be created in the XStream administrator's schema.

For example, assume that you want to create a database link in a configuration with the following characteristics:

  • The global name of the source database is dbs1.example.com.

  • The global name of the destination database is dbs2.example.com.

  • The XStream administrator is xstrmadmin at each database.

Given these assumptions, the following statement creates a database link from dbs1.example.com to dbs2.example.com:

CONNECT xstrmadmin@dbs1.example.com
Enter password: password

CREATE DATABASE LINK dbs2.example.com CONNECT TO xstrmadmin 
   IDENTIFIED BY password USING 'dbs2.example.com';

See Also:


Ensure That Each Source Database Is in ARCHIVELOG Mode

Each source database that generates changes that will be captured by a capture process must be in ARCHIVELOG mode. For downstream capture processes, the downstream database also must be in ARCHIVELOG mode if you plan to configure a real-time downstream capture process. The downstream database does not need to be in ARCHIVELOG mode if you plan to run only archived-log downstream capture processes on it.

If you are configuring XStream in an Oracle Real Application Clusters (Oracle RAC) environment, then the archived redo log files of all threads from all instances must be available to any instance running a capture process. This requirement pertains to both local and downstream capture processes.


See Also:

Oracle Database Administrator's Guide for instructions about running a database in ARCHIVELOG mode

Set the Relevant Initialization Parameters

Some initialization parameters are important for the configuration, operation, reliability, and performance of the components in an XStream configuration. Set these parameters appropriately.

Oracle Streams Replication Administrator's Guide contains detailed information about all of the initialization parameters that are important for an Oracle Streams environment. The guidelines for setting these parameters also apply to an XStream configuration. In addition to the requirements described in Oracle Streams Replication Administrator's Guide for all Oracle Streams components, the following requirements apply to XStream outbound servers:

  • Ensure that the PROCESSES initialization parameter is set to a value large enough to accommodate the outbound server background processes and all of the other Oracle Database background processes.

  • Ensure that the SESSIONS initialization parameter is set to a value large enough to accommodate the sessions used by the outbound server background processes and all of the other Oracle Database sessions.

Configure the Oracle Streams Pool

The Oracle Streams pool is a portion of memory in the System Global Area (SGA) that is used by Oracle Streams. The Oracle Streams pool stores buffered queue messages in memory, and it provides memory for capture processes and outbound servers. The Oracle Streams pool always stores LCRs captured by a capture process, and it stores LCRs and messages that are enqueued into a buffered queue by applications. Ensure that there is enough space in the Oracle Streams pool at each database to store LCRs and run the components properly.

Each outbound server requires 1 MB of memory. The Oracle Streams pool is initialized the first time an outbound server is started.


See Also:

Oracle Streams Replication Administrator's Guide for information about Oracle Streams pool requirements

If Required, Configure Log File Transfer to a Downstream Database

If you decided to use a local capture process, then log file transfer is not required. However, if you decided to use downstream capture that uses redo transport services to transfer archived redo log files to the downstream database automatically, then configure log file transfer from the source database to the capture database. See "Decide How to Configure XStream" for information about this decision.

If Required, Add Standby Redo Logs for Real-Time Downstream Capture

If you decided to configure real-time downstream capture, then add standby redo logs to the capture database. See "Decide How to Configure XStream" for information about this decision.

Preparing for XStream In

Ensure that the following prerequisites are met before configuring XStream In:

Configure an XStream Administrator

To configure and manage an XStream In configuration, create an XStream administrator on the Oracle database that will run the XStream inbound server.

Set the Relevant Initialization Parameters Relevant

Some initialization parameters are important for the configuration, operation, reliability, and performance of XStream inbound servers. Set these parameters appropriately.

Oracle Streams Replication Administrator's Guide contains detailed information about all of the initialization parameters that are important for an Oracle Streams environment. The guidelines for setting these parameters also apply to an XStream configuration. In addition to the requirements described in Oracle Streams Replication Administrator's Guide for all Oracle Streams components, the following requirements apply to XStream inbound servers:

  • Ensure that the PROCESSES initialization parameter is set to a value large enough to accommodate the inbound server background processes and all of the other Oracle Database background processes.

  • Ensure that the SESSIONS initialization parameter is set to a value large enough to accommodate the sessions used by the inbound server background processes and all of the other Oracle Database sessions.

Configure the Oracle Streams Pool

The Oracle Streams pool is a portion of memory in the System Global Area (SGA) that provides memory for inbound servers. Ensure that there is enough space in the Oracle Streams pool for the inbound server to run properly. An inbound server requires 1 MB for each inbound server parallelism. For example, if parallelism is set to 10 for an inbound server, then at least 10 MB of memory is required for the inbound server. The Oracle Streams pool also must have enough space to store LCRs before they are applied. The Oracle Streams pool is initialized the first time an inbound server is started.

Configuring XStream Out

An outbound server in an XStream Out configuration streams Oracle database changes to a client application. The client application attaches to the outbound server using the Oracle Call Interface (OCI) or Java interface to receive these changes.

Configuring an outbound server involves creating the components that send captured database changes to the outbound server. It also involves configuring the outbound server itself, which includes specifying the connect user that the client application will use to attach to the outbound server.

This section contains these topics:

Configuring an XStream Outbound Server

You can create an outbound server using the following procedures in the DBMS_XSTREAM_ADM package:

  • The CREATE_OUTBOUND procedure creates an outbound server, a queue, and a capture process in a single database with one procedure call.

  • The ADD_OUTBOUND procedure only creates an outbound server. You must create the capture process and queue separately, and they must exist before you run the ADD_OUTBOUND procedure. You can configure the capture process on the same database as the outbound server or on a different database.

In both cases, you must create the client application that communicates with the outbound server and receives LCRs from the outbound server.

If you require multiple outbound servers, then you can use the CREATE_OUTBOUND procedure to create the capture process that captures database changes for the first outbound server. Next, you can run the ADD_OUTBOUND procedure to add additional outbound servers that receive the same captured changes. The capture process can reside on the same database as the outbound servers or on a different database.

This section contains these topics:

Configuring Multiple XStream Out Components Using CREATE_OUTBOUND

The CREATE_OUTBOUND procedure in the DBMS_XSTREAM_ADM package creates a capture process, queue, and outbound server in a single database. Both the capture process and the outbound server use the queue created by the procedure. When you run the procedure, you provide the name of the new outbound server, while the procedure generates a name for the capture process and queue. If you want all of the components to run on the same database, then the CREATE_OUTBOUND procedure is the fastest and easiest way to create an outbound server.

Prerequisites

Before configuring XStream Out, ensure that the following prerequisites are met:

Assumptions

This section makes the following assumptions:

  • The capture process will be a local capture process, and it will run on the same database as the outbound server.

    The instructions in this section can only set up the local capture and outbound server on the same database configuration described in "Decide How to Configure XStream".

  • The name of the outbound server is xout.

  • Data manipulation language (DML) and data definition language (DDL) changes made to the oe.orders and oe.order_items tables are sent to the outbound server.

  • DML and DDL changes made to the hr schema are sent to the outbound server.

Figure 4-5 provides an overview of this XStream Out configuration.

Figure 4-5 Sample XStream Out Configuration Created Using CREATE_OUTBOUND

Description of Figure 4-5 follows
Description of "Figure 4-5 Sample XStream Out Configuration Created Using CREATE_OUTBOUND"

To create an outbound server using the CREATE_OUTBOUND procedure: 

  1. In SQL*Plus, connect to the database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the CREATE_OUTBOUND procedure.

    Given the assumptions for this section, run the following CREATE_OUTBOUND procedure:

    DECLARE
      tables  DBMS_UTILITY.UNCL_ARRAY;
      schemas DBMS_UTILITY.UNCL_ARRAY;
      BEGIN
        tables(1)  := 'oe.orders';
        tables(2)  := 'oe.order_items';
        schemas(1) := 'hr';
      DBMS_XSTREAM_ADM.CREATE_OUTBOUND(
        server_name     =>  'xout',
        table_names     =>  tables,
        schema_names    =>  schemas);
    END;
    /
    

    Running this procedure performs the following actions:

    • Configures supplemental logging for the oe.orders and oe.order_items tables and for all of the tables in the hr schema.

    • Creates a queue with a system-generated name that is used by the capture process and the outbound server.

    • Creates and starts a capture process with a system-generated name with rule sets that instruct it to capture DML and DDL changes to the oe.orders table, the oe.order_items table, and the hr schema.

    • Creates and starts an outbound server named xout with rule sets that instruct it to send DML and DDL changes to the oe.orders table, the oe.order_items table, and the hr schema to the client application.

    • Sets the current user as the connect user for the outbound server. In this example, the current user is the XStream administrator. The client application must connect to the database as the connect user to interact with the outbound server.


    Tip:

    To capture and send all database changes to the outbound server, specify NULL (the default) for the table_names and schema_names parameters.

  3. Create and run the client application that will connect to the outbound server and receive the LCRs. See "Sample XStream Client Application" for a sample application.

  4. To add one or more additional outbound servers that receive LCRs from the capture process created in Step 2, follow the instructions in "Adding an Additional Outbound Server to a Capture Process Stream".

Configuring an Outbound Server Using ADD_OUTBOUND

The ADD_OUTBOUND procedure in the DBMS_XSTREAM_ADM package creates an outbound server. This procedure does not create the capture process or the queue. You must configure these components manually.

The instructions in this section can set up any of the configurations described in "Decide How to Configure XStream". However, if you chose the local capture and outbound server on the same database configuration, then it is usually easier to use the CREATE_OUTBOUND procedure to configure all of the components simultaneously. See "Configuring Multiple XStream Out Components Using CREATE_OUTBOUND".

Prerequisites

Before configuring XStream Out, ensure that the following prerequisites are met:

Assumptions

This section makes the following assumptions:

  • The name of the outbound server is xout.

  • The queue used by the outbound server is xstrmadmin.xstream_queue.

  • The source database is db1.example.com.

  • DML and DDL changes made to the oe.orders and oe.order_items tables are sent to the outbound server.

  • DML and DDL changes made to the hr schema are sent to the outbound server.

  • The capture process for the outbound server does not exist. (If the capture process exists, then skip Steps 1 to 3, and go to Step 4.)

Figure 4-6 provides an overview of this XStream Out configuration.

Figure 4-6 Sample XStream Out Configuration Created Using ADD_OUTBOUND

Description of Figure 4-6 follows
Description of "Figure 4-6 Sample XStream Out Configuration Created Using ADD_OUTBOUND"


Note:

If the capture database and the outbound server database are different databases, then a propagation propagates the LCRs to a queue at the outbound server database. If the capture database and outbound server database are the same, then the propagation is not needed.

To create an outbound server using the ADD_OUTBOUND procedure: 

  1. In SQL*Plus, connect to the database that will run the capture process (the capture database) as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Create the queue that will be used by the capture process.

    See Oracle Streams Replication Administrator's Guide for instructions.

  3. Create the capture process.

    Add rules to the capture process's rule sets to capture changes to the hr schema, the oe.orders table, and the oe.order_items table. Do not start the capture process.

    See Oracle Streams Replication Administrator's Guide for instructions.

  4. If the capture process will run on a different database than the outbound server, then set the xout_client_exists capture process parameter to Y.

    Setting this parameter to Y enables the capture process to send LCRs to an outbound server.

    Skip this step if the capture process will run on the same database as the outbound server. In this case, the xout_client_exists capture process parameter will be set to Y automatically.

    See Oracle Streams Concepts and Administration for information about setting a capture process parameter. See Oracle Database PL/SQL Packages and Types Reference for information about the xout_client_exists capture process parameter.

  5. Connect to the source database.

    The source database is the database that contains the database objects for which the capture process will capture changes. The source database and the capture database might be the same database.

  6. Ensure that required supplemental logging is specified for the database objects at the source database.

    Supplemental logging is required for the database objects for which the capture process will capture changes. If the capture database and the source database are the same database, then supplemental logging might have been specified during capture process creation.

    Ensure that the following supplemental logging is specified at the source database:

    • Any columns at the source database that are used in a primary key in tables for which changes are processed by the outbound server must be unconditionally logged in a log group or by database supplemental logging of primary key columns.

    • Any columns at the source database that are used by a rule or a rule-based transformation must be unconditionally logged.

    For the example in this section, ensure that supplemental logging is configured for the hr schema, the oe.orders table, and the oe.order_items table.

    See Oracle Streams Replication Administrator's Guide for instructions about specifying supplemental logging.

  7. Connect to the database that will run the outbound server as the XStream administrator.

  8. Create the queue that will be used by the outbound server.

    This step is not required if the capture process and the outbound server run on the same database and use the same queue.

    See Oracle Streams Replication Administrator's Guide for instructions.

  9. Run the ADD_OUTBOUND procedure.

    Given the assumption for this section, run the following ADD_OUTBOUND procedure:

    DECLARE
      tables  DBMS_UTILITY.UNCL_ARRAY;
      schemas DBMS_UTILITY.UNCL_ARRAY;
      BEGIN
        tables(1)  := 'oe.orders';
        tables(2)  := 'oe.order_items';
        schemas(1) := 'hr';
      DBMS_XSTREAM_ADM.ADD_OUTBOUND(
        server_name     =>  'xout',
        queue_name      =>  'xstrmadmin.xstream_queue',
        source_database =>  'db1.example.com',
        table_names     =>  tables,
        schema_names    =>  schemas);
    END;
    /
    

    If the capture process runs on the same database as the outbound server, then specify the capture process's queue for the queue_name parameter.

    Running this procedure performs the following actions:

    • Creates an outbound server named xout. The outbound server has rule sets that instruct it to send DML and DDL changes to the oe.orders table, the oe.order_items table, and the hr schema to the client application. The rules specify that these changes must have originated at the db1.example.com database. The outbound server dequeues LCRs from the queue xstrmadmin.xstream_queue.

    • Sets the current user as the connect user for the outbound server. In this example, the current user is the XStream administrator. The client application must connect to the database as the connect user to interact with the outbound server.


    Tip:

    For the outbound server to receive all of the LCRs sent by the capture process, specify NULL (the default) for the table_names and schema_names parameters.

  10. Connect to the capture database as the XStream administrator.

  11. Create the propagation that sends LCRs from the capture process's queue on the local database to the queue used by the outbound server on the outbound server database.

    Add rules to the propagation's rule sets to send changes to the hr schema, the oe.orders table, and the oe.order_items table from the source queue to the destination queue.

    This step is not required if the capture process and the outbound server run on the same database and use the same queue.

    See Oracle Streams Replication Administrator's Guide for instructions.

  12. Create and run the client application that will connect to the outbound server and receive the LCRs. See "Sample XStream Client Application" for a sample application.

  13. Connect to the database that is running outbound server as the XStream administrator.

  14. Start the outbound server if it is disabled. For example:

    exec DBMS_APPLY_ADM.START_APPLY('xout');
    
  15. Connect to the capture database as the XStream administrator.

  16. Start the capture process created in Step 3.

    See Oracle Streams Concepts and Administration for instructions.

  17. To add one or more additional outbound servers that receive LCRs from the capture process created in Step 3, follow the instructions in "Adding an Additional Outbound Server to a Capture Process Stream".

Adding an Additional Outbound Server to a Capture Process Stream

XStream Out configurations often require multiple outbound servers that process a stream of LCRs from a single capture process. This section describes adding an additional outbound server to a database that already includes at least one outbound server. The additional outbound server uses the same queue as another outbound server to receive the LCRs from the capture process. When an XStream Out environment exists, use the ADD_OUTBOUND procedure in the DBMS_XSTREAM_ADM package to add another outbound server to a capture process stream.

Prerequisites

Before completing the steps in this section, configure an XStream Out environment that includes at least one outbound server. The following sections describe configuring and XStream Out environment:

Assumptions

This section makes the following assumptions:

  • The name of the outbound server is xout2.

  • The queue used by the outbound server is xstrmadmin.xstream_queue.

  • DML and DDL changes made to the oe.orders and oe.order_items tables are sent to the outbound server.

  • DML and DDL changes made to the hr schema are sent to the outbound server.

  • The source database for the database changes is db1.example.com.

Figure 4-7 provides an overview of this XStream Out configuration.

Figure 4-7 Sample XStream Out Configuration With an Additional Outbound Server

Description of Figure 4-7 follows
Description of "Figure 4-7 Sample XStream Out Configuration With an Additional Outbound Server"

To add another outbound server to a capture process stream using the ADD_OUTBOUND procedure: 

  1. In SQL*Plus, connect to the database that will run the additional outbound server as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Determine the name of the queue used by an existing outbound server that receives LCRs from the capture process.

    Run the query in "Displaying General Information About an Outbound Server" to determine the owner and name of the queue. This query also shows the name of the capture process and the source database name.

  3. Run the ADD_OUTBOUND procedure.

    Given the assumptions for this section, run the following ADD_OUTBOUND procedure:

    DECLARE
      tables  DBMS_UTILITY.UNCL_ARRAY;
      schemas DBMS_UTILITY.UNCL_ARRAY;
      BEGIN
        tables(1)  := 'oe.orders';
        tables(2)  := 'oe.order_items';
        schemas(1) := 'hr';
      DBMS_XSTREAM_ADM.ADD_OUTBOUND(
        server_name     =>  'xout2',
        queue_name      =>  'xstrmadmin.xstream_queue',
        source_database =>  'db1.example.com',
        table_names     =>  tables,
        schema_names    =>  schemas);
    END;
    /
    

    Running this procedure performs the following actions:

    • Creates an outbound server named xout2. The outbound server has rule sets that instruct it to send DML and DDL changes to the oe.orders table, the oe.order_items table, and the hr schema to the client application. The rules specify that these changes must have originated at the db1.example.com database. The outbound server dequeues LCRs from the queue xstrmadmin.xstream_queue.

    • Sets the current user as the connect user for the outbound server. In this example, the current user is the XStream administrator. The client application must connect to the database as the connect user to interact with the outbound server.


    Tip:

    For the outbound server to receive all of the LCRs sent by the capture process, specify NULL (the default) for the table_names and schema_names parameters.

  4. If a client application does not exist, then create and run the client application that will connect to the outbound server and receive the LCRs. See "Sample XStream Client Application" for a sample application.

Configuring XStream In

An inbound server in an XStream In configuration receives a stream of changes from a client application. The inbound server can apply these changes to database objects in an Oracle database, or it can process the changes in a customized way. A client application can attach to an inbound server and send row changes and DDL changes encapsulated in LCRs using the OCI or Java interface.

The CREATE_INBOUND procedure in the DBMS_XSTREAM_ADM package creates an inbound server. You must create the client application that communicates with the inbound server and sends LCRs to the inbound server.

Prerequisites

Before configuring XStream In, ensure that the following prerequisites are met:

Assumptions

This section makes the following assumptions:

Figure 4-8 provides an overview of this XStream In configuration.

Figure 4-8 Sample XStream In Configuration

Description of Figure 4-8 follows
Description of "Figure 4-8 Sample XStream In Configuration"

To create an inbound server: 

  1. In SQL*Plus, connect to the database that will run the inbound server as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the CREATE_INBOUND procedure.

    For example, the following CREATE_INBOUND procedure configures an inbound server named xin:

    BEGIN
      DBMS_XSTREAM_ADM.CREATE_INBOUND(
        server_name => 'xin',
        queue_name  => 'xin_queue');
    END;
    /
    

    Running this procedure performs the following actions:

    • Creates an inbound server named xin.

    • Sets the queue with the name xin_queue as the inbound server's queue, and creates this queue if it does not exist. This queue does not store LCRs sent by the client application. Instead, it stores error transactions if an LCR raises an error. The current user is the queue owner. In this example, the current user is the XStream administrator.

    • Sets the current user as the apply user for the inbound server. In this example, the current user is the XStream administrator. The client application must connect to the database as the apply user to interact with the inbound server.


    Tip:

    By default, an inbound server does not use rules or rule sets. Therefore, it processes all LCRs sent to it by the client application. To add rules and rule sets, use the DBMS_STREAMS_ADM package or the DBMS_RULE_ADM package. See Oracle Streams Concepts and Administration.

  3. If necessary, create apply handlers for the inbound server.

    Apply handlers are optional. Apply handlers process LCRs sent to an inbound server in a customized way.

  4. Create and run the client application that will connect to the inbound server and send LCRs to it.

    See "Sample XStream Client Application" for a sample application.

  5. If the inbound server is disabled, then start the inbound server.

    For example, enter the following:

    exec DBMS_APPLY_ADM.START_APPLY('xin');
    

Sample XStream Client Application

This section contains a sample XStream client application. This application illustrates the basic tasks that are required of an XStream Out and XStream In application.

The application performs the following tasks:

In an XStream Out configuration that does not send LCRs to an inbound server, the client application must obtain the processed low position in another way.

This application waits indefinitely for transactions from the outbound server. To interrupt the application, enter the interrupt command for your operating system. For example, the interrupt command on some operating systems is control-C. If the program is restarted, then the outbound server starts sending LCRs from the processed low position that was set during the previous run.

Figure 4-9 provides an overview of the XStream environment configured in this section.

Figure 4-9 Sample XStream Configuration

Description of Figure 4-9 follows
Description of "Figure 4-9 Sample XStream Configuration"

Before running the sample application, ensure that the following components exist:

The sample applications in the following sections perform the same tasks. One sample application uses the OCI API, and the other uses the Java API.


Note:

An Oracle Database installation includes several XStream demos. These demos are in the following location:
$ORACLE_HOME/rdbms/demo/xstream

Sample XStream Client Application for the Oracle Call Interface API

To run the sample XStream client application for the OCI API, compile and link the application file, and enter the following on a command line:

xio -ob_svr xout_name -ob_db sn_xout_db -ob_usr xout_cu -ob_pwd xout_cu_pass 
-ib_svr xin_name -ib_db sn_xin_db -ib_usr xin_au -ib_pwd xin_au_pass

Substitute the appropriate values for the following placeholders:

  • xout_name is the name of the outbound server.

  • sn_xout_db is the service name for the outbound server's database.

  • xout_cu is the outbound server's connect user.

  • xout_cu_pass is the password for the outbound server's connect user.

  • xin_name is the name of the inbound server.

  • sn_xin_db is the service name for the inbound server's database.

  • xin_au is the inbound server's apply user.

  • xin_au_pass is the password for the inbound server's apply user.

When the sample client application is running, it prints information about the row LCRs it is processing. The output looks similar to the following:

 ----------- ROW LCR Header  -----------------
  src_db_name=DB.EXAMPLE.COM
  cmd_type=UPDATE txid=17.0.74
  owner=HR oname=COUNTRIES 
 
 ----------- ROW LCR Header  -----------------
  src_db_name=DB.EXAMPLE.COM
  cmd_type=COMMIT txid=17.0.74
 
 ----------- ROW LCR Header  -----------------
  src_db_name=DB.EXAMPLE.COM
  cmd_type=UPDATE txid=12.25.77
  owner=OE oname=ORDERS 
 
 ----------- ROW LCR Header  -----------------
  src_db_name=DB.EXAMPLE.COM
  cmd_type=UPDATE txid=12.25.77
  owner=OE oname=ORDERS 

This output contains the following information for each row LCR:

  • src_db_name shows the source database for the change encapsulated in the row LCR.

  • cmd_type shows the type of SQL statement that made the change.

  • txid shows the transaction ID of the transaction that includes the row LCR.

  • owner shows the owner of the database object that was changed.

  • oname shows the name of the database object that was changed.

This demo is available in the following location:

$ORACLE_HOME/rdbms/demo/xstream/oci

The file name for the demo is xio.c. See the README.txt file in the demo directory for more information about compiling and running the application.

The code for the sample application that uses the OCI API follows:

#ifndef OCI_ORACLE
#include <oci.h>
#endif
 
#ifndef _STDIO_H
#include <stdio.h>
#endif
 
#ifndef _STDLIB_H
#include <stdlib.h>
#endif
 
#ifndef _STRING_H
#include <string.h>
#endif
 
#ifndef _MALLOC_H
#include <malloc.h>
#endif
 
/*---------------------------------------------------------------------- 
 *           Internal structures
 *----------------------------------------------------------------------*/ 
 
#define M_DBNAME_LEN    (128)
 
typedef struct conn_info                                     /* connect info */
{
  oratext * user;
  ub4       userlen;
  oratext * passw;
  ub4       passwlen;
  oratext * dbname;
  ub4       dbnamelen;
  oratext * svrnm;
  ub4       svrnmlen;
} conn_info_t;
 
typedef struct params
{
  conn_info_t  xout;                                        /* outbound info */
  conn_info_t  xin;                                          /* inbound info */
} params_t;
 
typedef struct oci                                            /* OCI handles */
{
  OCIEnv      *envp;                                   /* Environment handle */
  OCIError    *errp;                                         /* Error handle */
  OCIServer   *srvp;                                        /* Server handle */
  OCISvcCtx   *svcp;                                       /* Service handle */
  OCISession  *authp;
  OCIStmt    *stmtp;        
  boolean     attached;
  boolean     outbound;
} oci_t;
 
static void connect_db(conn_info_t *opt_params_p, oci_t ** ocip, ub2 char_csid,
                       ub2 nchar_csid);
static void disconnect_db(oci_t * ocip);
static void ocierror(oci_t * ocip, char * msg);
static void attach(oci_t * ocip, conn_info_t *conn, boolean outbound);
static void detach(oci_t *ocip);
static void get_lcrs(oci_t *xin_ocip, oci_t *xout_ocip);
static void get_chunks(oci_t *xin_ocip, oci_t *xout_ocip);
static void print_lcr(oci_t *ocip, void *lcrp, ub1 lcrtype, 
                      oratext **src_db_name, ub2  *src_db_namel);
static void print_chunk (ub1 *chunk_ptr, ub4 chunk_len, ub2 dty);
static void get_inputs(conn_info_t *xout_params, conn_info_t *xin_params, 
                       int argc, char ** argv);
static void get_db_charsets(conn_info_t *params_p, ub2 *char_csid, 
                            ub2 *nchar_csid);
static void set_client_charset(oci_t *outbound_ocip);
 
#define OCICALL(ocip, function) do {\
sword status=function;\
if (OCI_SUCCESS==status) break;\
else if (OCI_ERROR==status) \
{ocierror(ocip, (char *)"OCI_ERROR");\
exit(1);}\
else {printf("Error encountered %d\n", status);\
exit(1);}\
} while(0)
 
/*---------------------------------------------------------------------
 *                M A I N   P R O G R A M
 *---------------------------------------------------------------------*/
main(int argc, char **argv)
{
  /* Outbound and inbound connection info */
  conn_info_t   xout_params;
  conn_info_t   xin_params;
  oci_t        *xout_ocip = (oci_t *)NULL;
  oci_t        *xin_ocip = (oci_t *)NULL;
  ub2           obdb_char_csid = 0;                 /* outbound db char csid */
  ub2           obdb_nchar_csid = 0;               /* outbound db nchar csid */
 
  /* parse command line arguments */
  get_inputs(&xout_params, &xin_params, argc, argv); 
 
  /* Get the outbound database CHAR and NCHAR character set info */
  get_db_charsets(&xout_params, &obdb_char_csid, &obdb_nchar_csid);
 
  /* Connect to the outbound db and set the client env to the outbound charsets
   * to minimize character conversion when transferring LCRs from outbound 
   * directly to inbound server. 
   */
  connect_db(&xout_params, &xout_ocip, obdb_char_csid, obdb_nchar_csid);
 
  /* Attach to outbound server */
  attach(xout_ocip, &xout_params, TRUE);
 
  /* connect to inbound db and set the client charsets the same as the 
   * outbound db charsets.
   */
  connect_db(&xin_params, &xin_ocip, obdb_char_csid, obdb_nchar_csid);
 
  /* Attach to inbound server */
  attach(xin_ocip, &xin_params, FALSE);
 
  /* Get lcrs from outbound server and send to inbound server */
  get_lcrs(xin_ocip, xout_ocip);
 
  /* Detach from XStream servers */
  detach(xout_ocip);
  detach(xin_ocip);
 
  /* Disconnect from both databases */
  disconnect_db(xout_ocip);
  disconnect_db(xin_ocip);
 
  free(xout_ocip);
  free(xin_ocip);
  exit (0);
}
 
/*---------------------------------------------------------------------
 * connect_db - Connect to the database and set the env to the given
 * char and nchar character set ids. 
 *---------------------------------------------------------------------*/
static void connect_db(conn_info_t *params_p, oci_t **ociptr, ub2 char_csid,
                ub2 nchar_csid)
{
  oci_t        *ocip;
 
  printf ("Connect to Oracle as %.*s@%.*s ",
          params_p->userlen, params_p->user, 
          params_p->dbnamelen, params_p->dbname);
       
  if (char_csid && nchar_csid)
    printf ("using char csid=%d and nchar csid=%d", char_csid, nchar_csid);
 
  printf("\n");
 
  ocip = (oci_t *)malloc(sizeof(oci_t));
 
  if (OCIEnvNlsCreate(&ocip->envp, OCI_OBJECT, (dvoid *)0,
                     (dvoid * (*)(dvoid *, size_t)) 0,
                     (dvoid * (*)(dvoid *, dvoid *, size_t))0,
                     (void (*)(dvoid *, dvoid *)) 0,
                     (size_t) 0, (dvoid **) 0, char_csid, nchar_csid))
  {
    ocierror(ocip, (char *)"OCIEnvCreate() failed");
  }
 
  if (OCIHandleAlloc((dvoid *) ocip->envp, (dvoid **) &ocip->errp,
                     (ub4) OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0))
  {
    ocierror(ocip, (char *)"OCIHandleAlloc(OCI_HTYPE_ERROR) failed");
  }
 
  /* Logon to database */
  OCICALL(ocip,
          OCILogon(ocip->envp, ocip->errp, &ocip->svcp,
                   params_p->user, params_p->userlen,
                   params_p->passw, params_p->passwlen,
                   params_p->dbname, params_p->dbnamelen));
 
  /* allocate the server handle */
  OCICALL(ocip,
          OCIHandleAlloc((dvoid *) ocip->envp, (dvoid **) &ocip->srvp,
                         OCI_HTYPE_SERVER, (size_t) 0, (dvoid **) 0));
 
  OCICALL(ocip, 
          OCIHandleAlloc((dvoid *) ocip->envp, (dvoid **) &ocip->stmtp,
                     (ub4) OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0));
 
  if (*ociptr == (oci_t *)NULL)
  {
    *ociptr = ocip;
  }
}
 
/*---------------------------------------------------------------------
 * get_db_charsets - Get the database CHAR and NCHAR character set ids.
 *---------------------------------------------------------------------*/
static const oratext GET_DB_CHARSETS[] =  \
 "select parameter, value from nls_database_parameters where parameter = \
 'NLS_CHARACTERSET' or parameter = 'NLS_NCHAR_CHARACTERSET'";
 
#define PARM_BUFLEN      (30)
 
static void get_db_charsets(conn_info_t *params_p, ub2 *char_csid, 
                            ub2 *nchar_csid)
{
  OCIDefine  *defnp1 = (OCIDefine *) NULL;
  OCIDefine  *defnp2 = (OCIDefine *) NULL;
  oratext     parm[PARM_BUFLEN];
  oratext     value[OCI_NLS_MAXBUFSZ];
  ub2         parm_len = 0;
  ub2         value_len = 0;
  oci_t       ocistruct; 
  oci_t      *ocip = &ocistruct;
   
  *char_csid = 0;
  *nchar_csid = 0;
  memset (ocip, 0, sizeof(ocistruct));
 
  if (OCIEnvCreate(&ocip->envp, OCI_OBJECT, (dvoid *)0,
                     (dvoid * (*)(dvoid *, size_t)) 0,
                     (dvoid * (*)(dvoid *, dvoid *, size_t))0,
                     (void (*)(dvoid *, dvoid *)) 0,
                     (size_t) 0, (dvoid **) 0))
  {
    ocierror(ocip, (char *)"OCIEnvCreate() failed");
  }
 
  if (OCIHandleAlloc((dvoid *) ocip->envp, (dvoid **) &ocip->errp,
                     (ub4) OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0))
  {
    ocierror(ocip, (char *)"OCIHandleAlloc(OCI_HTYPE_ERROR) failed");
  }
 
  OCICALL(ocip, 
          OCILogon(ocip->envp, ocip->errp, &ocip->svcp,
                   params_p->user, params_p->userlen,
                   params_p->passw, params_p->passwlen,
                   params_p->dbname, params_p->dbnamelen));
 
  OCICALL(ocip, 
          OCIHandleAlloc((dvoid *) ocip->envp, (dvoid **) &ocip->stmtp,
                     (ub4) OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0));
 
  /* Execute stmt to select the db nls char and nchar character set */ 
  OCICALL(ocip, 
          OCIStmtPrepare(ocip->stmtp, ocip->errp,
                         (CONST text *)GET_DB_CHARSETS,
                         (ub4)strlen((char *)GET_DB_CHARSETS),
                         (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT));
 
  OCICALL(ocip,
          OCIDefineByPos(ocip->stmtp, &defnp1,
                         ocip->errp, (ub4) 1, parm,
                         PARM_BUFLEN, SQLT_CHR, (void*) 0,
                         &parm_len, (ub2 *)0, OCI_DEFAULT));
 
  OCICALL(ocip,
          OCIDefineByPos(ocip->stmtp, &defnp2,
                         ocip->errp, (ub4) 2, value,
                         OCI_NLS_MAXBUFSZ, SQLT_CHR, (void*) 0,
                         &value_len, (ub2 *)0, OCI_DEFAULT));
 
  OCICALL(ocip, 
          OCIStmtExecute(ocip->svcp, ocip->stmtp, 
                         ocip->errp, (ub4)0, (ub4)0, 
                         (const OCISnapshot *)0,
                         (OCISnapshot *)0, (ub4)OCI_DEFAULT));
 
  while (OCIStmtFetch(ocip->stmtp, ocip->errp, 1,
                      OCI_FETCH_NEXT, OCI_DEFAULT) == OCI_SUCCESS)
  {
    value[value_len] = '\0';
    if (parm_len == strlen("NLS_CHARACTERSET") &&
        !memcmp(parm, "NLS_CHARACTERSET", parm_len))
    {
      *char_csid = OCINlsCharSetNameToId(ocip->envp, value);
      printf("Outbound database NLS_CHARACTERSET = %.*s (csid = %d) \n",
             value_len, value, *char_csid);
    }
    else if (parm_len == strlen("NLS_NCHAR_CHARACTERSET") &&
             !memcmp(parm, "NLS_NCHAR_CHARACTERSET", parm_len))
    {
      *nchar_csid = OCINlsCharSetNameToId(ocip->envp, value);
      printf("Outbound database NLS_NCHAR_CHARACTERSET = %.*s (csid = %d) \n",
             value_len, value, *nchar_csid);
    }
  }
 
  disconnect_db(ocip);
}
 
/*---------------------------------------------------------------------
 * attach - Attach to XStream server specified in connection info
 *---------------------------------------------------------------------*/
static void attach(oci_t * ocip, conn_info_t *conn, boolean outbound)
{
  sword       err;
 
  printf ("Attach to XStream %s server '%.*s'\n", 
          outbound ? "outbound" : "inbound",
          conn->svrnmlen, conn->svrnm);
 
  if (outbound)
  {
    OCICALL(ocip, 
            OCIXStreamOutAttach(ocip->svcp, ocip->errp, conn->svrnm,
                              (ub2)conn->svrnmlen, (ub1 *)0, 0, OCI_DEFAULT));
  }
  else
  {
    OCICALL(ocip, 
            OCIXStreamInAttach(ocip->svcp, ocip->errp, conn->svrnm,
                               (ub2)conn->svrnmlen, 
                               (oratext *)"From_XOUT", 9,
                               (ub1 *)0, 0, OCI_DEFAULT));
  }
 
  ocip->attached = TRUE;
  ocip->outbound = outbound;
}
 
/*---------------------------------------------------------------------
 * ping_svr - Ping inbound server by sending a commit LCR.
 *---------------------------------------------------------------------*/
static void ping_svr(oci_t *xin_ocip, void *commit_lcr,
                     ub1 *cmtpos, ub2 cmtpos_len, 
                     oratext *source_db, ub2 source_db_len)
{
  OCIDate     src_time;
  oratext     txid[128];
 
  OCICALL(xin_ocip, OCIDateSysDate(xin_ocip->errp, &src_time));
  sprintf(txid, "Ping %2d:%2d:%2d",
          src_time.OCIDateTime.OCITimeHH,
          src_time.OCIDateTime.OCITimeMI,
          src_time.OCIDateTime.OCITimeSS);
 
  /* Initialize LCR with new txid and commit position */
  OCICALL(xin_ocip,
          OCILCRHeaderSet(xin_ocip->svcp, xin_ocip->errp,
                          source_db, source_db_len,
                          (oratext *)OCI_LCR_ROW_CMD_COMMIT,
                          (ub2)strlen(OCI_LCR_ROW_CMD_COMMIT),
                          (oratext *)0, 0,                     /* null owner */
                          (oratext *)0, 0,                    /* null object */
                          (ub1 *)0, 0,                           /* null tag */
                          txid, (ub2)strlen((char *)txid),
                          &src_time, cmtpos, cmtpos_len,
                          0, commit_lcr, OCI_DEFAULT));
 
  /* Send commit lcr to inbound server. */
  if (OCIXStreamInLCRSend(xin_ocip->svcp, xin_ocip->errp, commit_lcr,
                          OCI_LCR_XROW, 0, OCI_DEFAULT) == OCI_ERROR)
  {
    ocierror(xin_ocip, (char *)"OCIXStreamInLCRSend failed in ping_svr()");
  }
}
 
/*---------------------------------------------------------------------
 * get_lcrs - Get LCRs from outbound server and send to inbound server.
 *---------------------------------------------------------------------*/
static void get_lcrs(oci_t *xin_ocip, oci_t *xout_ocip)
{
  sword       status = OCI_SUCCESS;
  void       *lcr;
  ub1         lcrtype;
  oraub8      flag;
  ub1         proclwm[OCI_LCR_MAX_POSITION_LEN];
  ub2         proclwm_len = 0;
  ub1         sv_pingpos[OCI_LCR_MAX_POSITION_LEN];
  ub2         sv_pingpos_len = 0;
  u	mb1         fetchlwm[OCI_LCR_MAX_POSITION_LEN];
  ub2         fetchlwm_len = 0;
  void       *commit_lcr = (void *)0;
  oratext    *lcr_srcdb = (oratext *)0;
  ub2         lcr_srcdb_len = 0;
  oratext     source_db[M_DBNAME_LEN];
  ub2         source_db_len = 0;
  ub4         lcrcnt = 0;
 
  /* create an lcr to ping the inbound server periodically by sending a
   * commit lcr.
   */
  commit_lcr = (void*)0;
  OCICALL(xin_ocip,
          OCILCRNew(xin_ocip->svcp, xin_ocip->errp, OCI_DURATION_SESSION,
                    OCI_LCR_XROW, &commit_lcr, OCI_DEFAULT));
 
  while (status == OCI_SUCCESS)
  {
    lcrcnt = 0;                         /* reset lcr count before each batch */
 
    while ((status = 
                OCIXStreamOutLCRReceive(xout_ocip->svcp, xout_ocip->errp,
                                        &lcr, &lcrtype, &flag, 
                                        fetchlwm, &fetchlwm_len, OCI_DEFAULT))
                                               == OCI_STILL_EXECUTING)
    {
      lcrcnt++;
 
      /* print header of LCR just received */
      print_lcr(xout_ocip, lcr, lcrtype, &lcr_srcdb, &lcr_srcdb_len);
 
      /* save the source db to construct ping lcr later */
      if (!source_db_len && lcr_srcdb_len)
      {
        memcpy(source_db, lcr_srcdb, lcr_srcdb_len);
        source_db_len = lcr_srcdb_len;
      }
      
      /* send the LCR just received */
      if (OCIXStreamInLCRSend(xin_ocip->svcp, xin_ocip->errp, 
                              lcr, lcrtype, flag, OCI_DEFAULT) == OCI_ERROR)
      {
        ocierror(xin_ocip, (char *)"OCIXStreamInLCRSend failed");
      }
 
      /* If LCR has chunked columns (i.e, has LOB/Long/XMLType columns) */
      if (flag & OCI_XSTREAM_MORE_ROW_DATA)
      {
        /* receive and send chunked columns */
        get_chunks(xin_ocip, xout_ocip); 
      }
    }
 
    if (status == OCI_ERROR)
      ocierror(xout_ocip, (char *)"OCIXStreamOutLCRReceive failed");
 
    /* clear the saved ping position if we just received some new lcrs */
    if (lcrcnt)
    {
      sv_pingpos_len = 0;
    }
 
    /* If no lcrs received during previous WHILE loop and got a new fetch 
     * LWM then send a commit lcr to ping the inbound server with the new
     * fetch LWM position.
     */
    else if (fetchlwm_len > 0 && source_db_len > 0 &&
        (fetchlwm_len != sv_pingpos_len ||
         memcmp(sv_pingpos, fetchlwm, fetchlwm_len))) 
    {
      /* To ensure we don't send multiple lcrs with duplicate position, send
       * a new ping only if we have saved the last ping position.
       */
      if (sv_pingpos_len > 0)
      {     
        ping_svr(xin_ocip, commit_lcr, fetchlwm, fetchlwm_len,
                 source_db, source_db_len); 
      }
 
      /* save the position just sent to inbound server */
      memcpy(sv_pingpos, fetchlwm, fetchlwm_len);
      sv_pingpos_len = fetchlwm_len;
    }
 
    /* flush inbound network to flush all lcrs to inbound server */
    OCICALL(xin_ocip,
            OCIXStreamInFlush(xin_ocip->svcp, xin_ocip->errp, OCI_DEFAULT));
 
    
    /* get processed LWM of inbound server */   
    OCICALL(xin_ocip, 
            OCIXStreamInProcessedLWMGet(xin_ocip->svcp, xin_ocip->errp,
                                        proclwm, &proclwm_len, OCI_DEFAULT));
 
    if (proclwm_len > 0)
    {
      /* Set processed LWM for outbound server */
      OCICALL(xout_ocip, 
              OCIXStreamOutProcessedLWMSet(xout_ocip->svcp, xout_ocip->errp, 
                                           proclwm, proclwm_len, OCI_DEFAULT));
    }
  }
  
  if (status != OCI_SUCCESS)
    ocierror(xout_ocip, (char *)"get_lcrs() encounters error");
}
 
/*---------------------------------------------------------------------
 * get_chunks - Get each chunk for the current LCR and send it to 
 *              the inbound server.
 *---------------------------------------------------------------------*/
static void get_chunks(oci_t *xin_ocip, oci_t *xout_ocip)
{
  oratext *colname;
  ub2      colname_len;
  ub2      coldty;
  oraub8   col_flags;
  ub2      col_csid;
  ub4      chunk_len;
  ub1     *chunk_ptr;
  oraub8   row_flag;
  sword    err;
  sb4      rtncode;
 
  do
  {
    /* Get a chunk from outbound server */
    OCICALL(xout_ocip,
            OCIXStreamOutChunkReceive(xout_ocip->svcp, xout_ocip->errp, 
                                      &colname, &colname_len, &coldty, 
                                      &col_flags, &col_csid, &chunk_len, 
                                      &chunk_ptr, &row_flag, OCI_DEFAULT));
   
    /* print chunked column info */
    printf(
      "  Chunked column name=%.*s DTY=%d  chunk len=%d csid=%d col_flag=0x%x\n",
      colname_len, colname, coldty, chunk_len, col_csid, col_flags);
 
    /* print chunk data */
    print_chunk(chunk_ptr, chunk_len, coldty);
 
    /* Send the chunk just received to inbound server */
    OCICALL(xin_ocip,
            OCIXStreamInChunkSend(xin_ocip->svcp, xin_ocip->errp, colname,
                                  colname_len, coldty, col_flags,
                                  col_csid, chunk_len, chunk_ptr,
                                  row_flag, OCI_DEFAULT));
 
  } while (row_flag & OCI_XSTREAM_MORE_ROW_DATA);
}
 
/*---------------------------------------------------------------------
 * print_chunk - Print chunked column information. Only print the first
 *               50 bytes for each chunk.
 *---------------------------------------------------------------------*/
static void print_chunk (ub1 *chunk_ptr, ub4 chunk_len, ub2 dty)
{
#define MAX_PRINT_BYTES     (50)          /* print max of 50 bytes per chunk */
 
  ub4  print_bytes;
 
  if (chunk_len == 0)
    return;
 
  print_bytes = chunk_len > MAX_PRINT_BYTES ? MAX_PRINT_BYTES : chunk_len;
 
  printf("  Data = ", chunk_len);
  if (dty == SQLT_CHR)
    printf("%.*s", print_bytes, chunk_ptr);
  else
  {
    ub2  idx;
 
    for (idx = 0; idx < print_bytes; idx++)
      printf("%02x", chunk_ptr[idx]);
  }
  printf("\n");
}
 
/*---------------------------------------------------------------------
 * print_lcr - Print header information of given lcr.
 *---------------------------------------------------------------------*/
static void print_lcr(oci_t *ocip, void *lcrp, ub1 lcrtype, 
                      oratext **src_db_name, ub2  *src_db_namel)
{
  oratext     *cmd_type;
  ub2          cmd_type_len;
  oratext     *owner;
  ub2          ownerl;
  oratext     *oname;
  ub2          onamel;
  oratext     *txid;
  ub2          txidl;
  sword        ret;
 
  printf("\n ----------- %s LCR Header  -----------------\n",
         lcrtype == OCI_LCR_XDDL ? "DDL" : "ROW");
 
  /* Get LCR Header information */
  ret = OCILCRHeaderGet(ocip->svcp, ocip->errp, 
                        src_db_name, src_db_namel,              /* source db */
                        &cmd_type, &cmd_type_len,            /* command type */
                        &owner, &ownerl,                       /* owner name */
                        &oname, &onamel,                      /* object name */
                        (ub1 **)0, (ub2 *)0,                      /* lcr tag */
                        &txid, &txidl, (OCIDate *)0,   /* txn id  & src time */
                        (ub2 *)0, (ub2 *)0,              /* OLD/NEW col cnts */
                        (ub1 **)0, (ub2 *)0,                 /* LCR position */
                        (oraub8*)0, lcrp, OCI_DEFAULT);
 
  if (ret != OCI_SUCCESS)
    ocierror(ocip, (char *)"OCILCRHeaderGet failed");
  else
  {
    printf("  src_db_name=%.*s\n  cmd_type=%.*s txid=%.*s\n",
           *src_db_namel, *src_db_name, cmd_type_len, cmd_type, txidl, txid );
 
    if (ownerl > 0)
      printf("  owner=%.*s oname=%.*s \n", ownerl, owner, onamel, oname);
  } 
}
 
/*---------------------------------------------------------------------
 * detach - Detach from XStream server
 *---------------------------------------------------------------------*/
static void detach(oci_t * ocip)
{
  sword  err = OCI_SUCCESS;
 
  printf ("Detach from XStream %s server\n",
          ocip->outbound ? "outbound" : "inbound" );
 
  if (ocip->outbound)
  {
    OCICALL(ocip, OCIXStreamOutDetach(ocip->svcp, ocip->errp, OCI_DEFAULT));
  }
  else
  {
    OCICALL(ocip, OCIXStreamInDetach(ocip->svcp, ocip->errp, 
                                     (ub1 *)0, (ub2 *)0,    /* processed LWM */
                                     OCI_DEFAULT));
  }
}
 
/*---------------------------------------------------------------------
 * disconnect_db  - Logoff from the database
 *---------------------------------------------------------------------*/
static void disconnect_db(oci_t * ocip)
{
  if (OCILogoff(ocip->svcp, ocip->errp))
  {
    ocierror(ocip, (char *)"OCILogoff() failed");
  }
 
  if (ocip->errp)
    OCIHandleFree((dvoid *) ocip->errp, (ub4) OCI_HTYPE_ERROR);
 
  if (ocip->envp)
    OCIHandleFree((dvoid *) ocip->envp, (ub4) OCI_HTYPE_ENV);
}
 
/*---------------------------------------------------------------------
 * ocierror - Print error status and exit program
 *---------------------------------------------------------------------*/
static void ocierror(oci_t * ocip, char * msg)
{
  sb4 errcode=0;
  text bufp[4096];
 
  if (ocip->errp)
  {
    OCIErrorGet((dvoid *) ocip->errp, (ub4) 1, (text *) NULL, &errcode,
                bufp, (ub4) 4096, (ub4) OCI_HTYPE_ERROR);
    printf("%s\n%s", msg, bufp);
  }
  else
    puts(msg);
 
  printf ("\n");
  exit(1);
}
 
/*--------------------------------------------------------------------
 * print_usage - Print command usage
 *---------------------------------------------------------------------*/
static void print_usage(int exitcode)
{
  puts("\nUsage: xio -ob_svr <outbound_svr> -ob_db <outbound_db>\n" 
         "           -ob_usr <conn_user> -ob_pwd <conn_user_pwd>\n" 
         "           -ib_svr <inbound_svr> -ib_db <inbound_db>\n"
         "           -ib_usr <apply_user> -ib_pwd <apply_user_pwd>\n");
  puts("  ob_svr  : outbound server name\n"
       "  ob_db   : database name of outbound server\n"
       "  ob_usr  : connect user to outbound server\n"
       "  ob_pwd  : password of outbound's connect user\n"
       "  ib_svr  : inbound server name\n"
       "  ib_db   : database name of inbound server\n"
       "  ib_usr  : apply user for inbound server\n"
       "  ib_pwd  : password of inbound's apply user\n");
 
  exit(exitcode);
}
 
/*--------------------------------------------------------------------
 * get_inputs - Get user inputs from command line
 *---------------------------------------------------------------------*/
static void get_inputs(conn_info_t *xout_params, conn_info_t *xin_params, 
                       int argc, char ** argv)
{
  char * option;
  char * value;
 
  memset (xout_params, 0, sizeof(*xout_params));
  memset (xin_params, 0, sizeof(*xin_params));
  while(--argc)
  {
    /* get the option name */
    argv++;
    option = *argv;
 
    /* check that the option begins with a "-" */
    if (!strncmp(option, (char *)"-", 1))
    {
      option ++;
    }
    else
    {
      printf("Error: bad argument '%s'\n", option);
      print_usage(1);
    }
 
    /* get the value of the option */
    --argc;
    argv++;
 
    value = *argv;    
 
    if (!strncmp(option, (char *)"ob_db", 5))
    {
      xout_params->dbname = (oratext *)value;
      xout_params->dbnamelen = strlen(value);
    }
    else if (!strncmp(option, (char *)"ob_usr", 6))
    {
      xout_params->user = (oratext *)value;
      xout_params->userlen = strlen(value);
    }
    else if (!strncmp(option, (char *)"ob_pwd", 6))
    {
      xout_params->passw = (oratext *)value;
      xout_params->passwlen = strlen(value);
    }
    else if (!strncmp(option, (char *)"ob_svr", 6))
    {
      xout_params->svrnm = (oratext *)value;
      xout_params->svrnmlen = strlen(value);
    }
    else if (!strncmp(option, (char *)"ib_db", 5))
    {
      xin_params->dbname = (oratext *)value;
      xin_params->dbnamelen = strlen(value);
    }
    else if (!strncmp(option, (char *)"ib_usr", 6))
    {
      xin_params->user = (oratext *)value;
      xin_params->userlen = strlen(value);
    }
    else if (!strncmp(option, (char *)"ib_pwd", 6))
    {
      xin_params->passw = (oratext *)value;
      xin_params->passwlen = strlen(value);
    }
    else if (!strncmp(option, (char *)"ib_svr", 6))
    {
      xin_params->svrnm = (oratext *)value;
      xin_params->svrnmlen = strlen(value);
    }
    else
    {
      printf("Error: unknown option '%s'.\n", option);
      print_usage(1);
    }
  }
 
  /* print usage and exit if any argument is not specified */
  if (!xout_params->svrnmlen || !xout_params->passwlen || 
      !xout_params->userlen || !xout_params->dbnamelen ||
      !xin_params->svrnmlen || !xin_params->passwlen || 
      !xin_params->userlen || !xin_params->dbnamelen)
  {
    printf("Error: missing command arguments. \n");
    print_usage(1);
  }
}

Sample XStream Client Application for the Java API

To run the sample XStream client application for the Java API, compile and link the application file, and enter the following on a command line:

java xio xsin_oraclesid xsin_host xsin_port xsin_username 
xsin_passwd xin_servername xsout_oraclesid xsout_host xsout_port 
xsout_username xsout_passwd xsout_servername

Substitute the appropriate values for the following placeholders:

  • xsin_oraclesid is the Oracle SID of the inbound server's database.

  • xsin_host is the host name of the computer system running the inbound server.

  • xsin_port is the port number of the listener for the inbound server's database.

  • xsin_username is the inbound server's apply user.

  • xsin_passwd is the password for the inbound server's apply user.

  • xin_servername is the name of the inbound server.

  • xsout_oraclesid is the Oracle SID of the outbound server's database.

  • xsout_host is the host name of the computer system running the outbound server.

  • xsout_port is the port number of the listener for the outbound server's database.

  • xsout_username is the outbound server's connect user.

  • xsout_passwd is the password for the outbound server's connect user.

  • xsout_servername is the name of the outbound server.

When the sample client application is running, it prints information about attaching to the inbound server and outbound server, along with the last position for each server. The output looks similar to the following:

xsin_host = server2.example.com
xsin_port = 1482
xsin_ora_sid = db2
xsin connection url: jdbc:oracle:oci:@server2.example.com:1482:db2
xsout_host = server1.example.com
xsout_port = 1481
xsout_ora_sid = db1
xsout connection url: jdbc:oracle:oci:@server1.example.com:1481:db1
Attached to inbound server:xin
Inbound Server Last Position is: 0000000920250000000100000001000000092025000000010000000101
Attached to outbound server:xout
Last Position is: 0000000920250000000100000001000000092025000000010000000101

This demo is available in the following location:

$ORACLE_HOME/rdbms/demo/xstream/java

The file name for the demo is xio.java. See the README.txt file in the demo directory for more information about compiling and running the application.

The code for the sample application that uses the Java API follows:

import oracle.streams.*;
import oracle.jdbc.internal.OracleConnection;
import oracle.jdbc.*;
import oracle.sql.*;
import java.sql.*;
import java.util.*;
 
public class xio
{
  public static String xsinusername = null;
  public static String xsinpasswd = null;
  public static String xsinName = null;
  public static String xsoutusername = null;
  public static String xsoutpasswd = null;
  public static String xsoutName = null;
  public static String in_url = null;
  public static String out_url = null;
  public static Connection in_conn = null;
  public static Connection out_conn = null;
  public static XStreamIn xsIn = null;
  public static XStreamOut xsOut = null;
  public static byte[] lastPosition = null;
  public static byte[] processedLowPosition = null;
    
  public static void main(String args[])
  {
    // get connection url to inbound and outbound server
    in_url = parseXSInArguments(args);    
    out_url = parseXSOutArguments(args);    
 
    // create connection to inbound and outbound server
    in_conn = createConnection(in_url, xsinusername, xsinpasswd);
    out_conn = createConnection(out_url, xsoutusername, xsoutpasswd);
 
    // attach to inbound and outbound server
    xsIn = attachInbound(in_conn);
    xsOut = attachOutbound(out_conn);
    
    // main loop to get lcrs 
    get_lcrs(xsIn, xsOut);
    
    // detach from inbound and outbound server
    detachInbound(xsIn);
    detachOutbound(xsOut);
  }
    
  // parse the arguments to get the conncetion url to inbound db
  public static String parseXSInArguments(String args[])
  {
    String trace, pref;
    String orasid, host, port;
    
    if (args.length != 12)
    {
      printUsage();
      System.exit(0);
    }
 
    orasid = args[0];
    host = args[1];
    port = args[2];
    xsinusername = args[3];
    xsinpasswd = args[4];
    xsinName = args[5];
    
    System.out.println("xsin_host = "+host);
    System.out.println("xsin_port = "+port);
    System.out.println("xsin_ora_sid = "+orasid);
 
    String in_url = "jdbc:oracle:oci:@"+host+":"+port+":"+orasid;
    System.out.println("xsin connection url: "+ in_url);
 
    return in_url;
  }
 
  // parse the arguments to get the conncetion url to outbound db
  public static String parseXSOutArguments(String args[])
  {
    String trace, pref;
    String orasid, host, port;
    
    if (args.length != 12)
    {
      printUsage();
      System.exit(0);
    }
 
    orasid = args[6];
    host = args[7];
    port = args[8];
    xsoutusername = args[9];
    xsoutpasswd = args[10];
    xsoutName = args[11];
    
    
    System.out.println("xsout_host = "+host);
    System.out.println("xsout_port = "+port);
    System.out.println("xsout_ora_sid = "+orasid);
 
    String out_url = "jdbc:oracle:oci:@"+host+":"+port+":"+orasid;
    System.out.println("xsout connection url: "+ out_url);
 
    return out_url;
  }
 
  // print out sample program usage message
  public static void printUsage()
  {
    System.out.println("");      
    System.out.println("Usage: java xio "+"<xsin_oraclesid> " + "<xsin_host> "
                                         + "<xsin_port> ");
    System.out.println("                "+"<xsin_username> " + "<xsin_passwd> "
                                         + "<xsin_servername> ");
    System.out.println("                "+"<xsout_oraclesid> " + "<xsout_host> "
                                         + "<xsout_port> ");
    System.out.println("                "+"<xsout_username> " + "<xsout_passwd> "
                                         + "<xsout_servername> ");
  }
 
  // create a connection to an Oracle Database
  public static Connection createConnection(String url, 
                                            String username, 
                                            String passwd)
  {
    try
    {
      DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
      return DriverManager.getConnection(url, username, passwd);
    }
    catch(Exception e)
    {
      System.out.println("fail to establish DB connection to: " +url);
      e.printStackTrace();
      return null;
    }
  }
 
  // attach to the XStream Inbound Server
  public static XStreamIn attachInbound(Connection in_conn)
  {
    XStreamIn xsIn = null;
    try
    {
      xsIn = XStreamIn.attach((OracleConnection)in_conn, xsinName,
                              "XSDEMOINCLIENT" , XStreamIn.DEFAULT_MODE);
 
      // use last position to decide where should we start sending LCRs  
      lastPosition = xsIn.getLastPosition();
      System.out.println("Attached to inbound server:"+xsinName);
      System.out.print("Inbound Server Last Position is: ");
      if (null == lastPosition)
      {
        System.out.println("null");
      }
      else
      {
        printHex(lastPosition);
      }
      return xsIn;
    }
    catch(Exception e)
    {
      System.out.println("cannot attach to inbound server: "+xsinName);
      System.out.println(e.getMessage());
      e.printStackTrace();
      return null;
    }        
  }
 
  // attach to the XStream Outbound Server    
  public static XStreamOut attachOutbound(Connection out_conn)
  {
    XStreamOut xsOut = null;
 
    try
    {
      // when attach to an outbound server, client needs to tell outbound
      // server the last position.
      xsOut = XStreamOut.attach((OracleConnection)out_conn, xsoutName,
                                lastPosition, XStreamOut.DEFAULT_MODE);
      System.out.println("Attached to outbound server:"+xsoutName);
      System.out.print("Last Position is: ");  
      if (lastPosition != null)
      {
        printHex(lastPosition);
      }
      else
      {
        System.out.println("NULL");
      }
      return xsOut;
    }
    catch(Exception e)
    {
      System.out.println("cannot attach to outbound server: "+xsoutName);
      System.out.println(e.getMessage());
      e.printStackTrace();
      return null;
    } 
  }
 
  // detach from the XStream Inbound Server
  public static void detachInbound(XStreamIn xsIn)
  {
    byte[] processedLowPosition = null;
    try
    {
      processedLowPosition = xsIn.detach(XStreamIn.DEFAULT_MODE);
      System.out.print("Inbound server processed low Position is: ");
      if (processedLowPosition != null)
      {
        printHex(processedLowPosition);
      }
      else
      {
        System.out.println("NULL");
      }
    }
    catch(Exception e)
    {
      System.out.println("cannot detach from the inbound server: "+xsinName);
      System.out.println(e.getMessage());
      e.printStackTrace();
    }
  }
 
  // detach from the XStream Outbound Server    
  public static void detachOutbound(XStreamOut xsOut)
  {
    try
    {
      xsOut.detach(XStreamOut.DEFAULT_MODE);
    }
    catch(Exception e)
    {
      System.out.println("cannot detach from the outbound server: "+xsoutName);
      System.out.println(e.getMessage());
      e.printStackTrace();
    }       
  }
 
  public static void get_lcrs(XStreamIn xsIn, XStreamOut xsOut)
  {
    byte[] ping_pos = null;
    byte[] fetchlwm = null;
    String src_db = null;
    
    if (null == xsIn) 
    {
      System.out.println("xstreamIn is null");
      System.exit(0);
    }
 
    if (null == xsOut)
    {
      System.out.println("xstreamOut is null");
      System.exit(0);
    }
 
    try
    {
      while(true) 
      {
        // receive an LCR from outbound server
        LCR alcr = xsOut.receiveLCR(XStreamOut.DEFAULT_MODE);
        fetchlwm = xsOut.getFetchLowWatermark();
    
        // save source db for ping lcr
        if (null != alcr)
          src_db = alcr.getSourceDatabaseName();
        
        if (xsOut.getBatchStatus() == XStreamOut.EXECUTING) // batch is active
        {
          assert alcr != null;
          // send the LCR to the inbound server
          xsIn.sendLCR(alcr, XStreamIn.DEFAULT_MODE);
 
          // also get chunk data for this LCR if any
          if (alcr instanceof RowLCR)
          {
            // receive chunk from outbound then send to inbound
            if (((RowLCR)alcr).hasChunkData())
            {
              ChunkColumnValue chunk = null; 
              do
              {
                chunk = xsOut.receiveChunk(XStreamOut.DEFAULT_MODE);
                xsIn.sendChunk(chunk, XStreamIn.DEFAULT_MODE);
              } while (!chunk.isEndOfRow());
            }
          }
          processedLowPosition = alcr.getPosition();
          ping_pos = processedLowPosition;          
        }
        else  // batch is end 
        {
          assert alcr == null;
 
          // send ping lcr if we haven't received any lcr in the batch
          // but we got a new fetch lwm, then send a commit lcr to
          // ping the inbound server with the new fetch LWM position
          if (null != src_db && null != fetchlwm && 
              !samePos(fetchlwm,ping_pos))
          {
            xsIn.sendLCR(createPing(src_db, fetchlwm), 
                         XStreamIn.DEFAULT_MODE);
            ping_pos = fetchlwm;
          }
 
          // flush the network
          xsIn.flush(XStreamIn.DEFAULT_MODE);
          // get the processed_low_position from inbound server
          processedLowPosition = 
              xsIn.getProcessedLowWatermark();
          // update the processed_low_position at oubound server
          if (null != processedLowPosition)
            xsOut.setProcessedLowWatermark(processedLowPosition, 
                                           XStreamOut.DEFAULT_MODE);
        }
      }
    }
    catch(Exception e)
    {
      System.out.println("exception when processing LCRs");
      System.out.println(e.getMessage());
      e.printStackTrace();
    }
  }
 
  public static void printHex(byte[] b) 
  {
    for (int i = 0; i < b.length; ++i) 
    {
      System.out.print(
        Integer.toHexString((b[i]&0xFF) | 0x100).substring(1,3));
    }
    System.out.println("");
  }    
 
  // ping lcr is used to bump up the inbound server watermark
  private static RowLCR createPing(String src_db, byte[] pos)
  {
    java.util.Date today = new java.util.Date();
    java.sql.Timestamp now = new java.sql.Timestamp(today.getTime());
    oracle.sql.DATE src_time = new oracle.sql.DATE(now);
 
 
    RowLCR alcr = new DefaultRowLCR();
    ((RowLCR)alcr).setSourceDatabaseName(src_db);
    ((RowLCR)alcr).setSourceTime(src_time);
    ((RowLCR)alcr).setPosition(pos);
    ((RowLCR)alcr).setCommandType(RowLCR.COMMIT);
    ((RowLCR)alcr).setTransactionId("Ping: " + src_time.toString());
 
    return alcr;
  }
 
  private static boolean samePos(byte[] pos1, byte[] pos2)
  {
    int   cmp_len;
    boolean    result;
 
    if (pos1.length != pos2.length)
      return false;
    
    for (int i = 0; i<pos1.length; i++)
    {
      if (pos1[i] != pos2[i])
        return false;            
    }
 
    return true;
  }
}
PK PK"8AOEBPS/title.htmo Oracle Database XStream Guide, 11g Release 2 (11.2)

Oracle® Database

XStream Guide

11g Release 2 (11.2)

E16545-07

August 2011


Oracle Database XStream Guide, 11g Release 2 (11.2)

E16545-07

Copyright © 2009, 2011, Oracle and/or its affiliates. All rights reserved.

Primary Author:  Randy Urbano

Contributors:  Lance Ashdown, Vinoth Chandar, Alan Downing, Thuvan Hoang, Richard Huang, Joydip Kundu, Tianshu Li, Edwina Lu, Rui Mao, Pat McElroy, Valarie Moore, Srikanth Nalla, Partha Raghunathan, Ashish Ray, Jim Stamos, Byron Wang, Lik Wong, Jun Yuan, Rod Ward, Haobo Xu, Kevin Xu

This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.

The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please report them to us in writing.

If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, the following notice is applicable:

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007). Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

This software or hardware is developed for general use in a variety of information management applications. It is not developed or intended for use in any inherently dangerous applications, including applications that may create a risk of personal injury. If you use this software or hardware in dangerous applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of this software or hardware in dangerous applications.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.

Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks are used under license and are trademarks or registered trademarks of SPARC International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or registered trademarks of Advanced Micro Devices. UNIX is a registered trademark of The Open Group.

This software or hardware and documentation may provide access to or information on content, products, and services from third parties. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party content, products, and services. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of third-party content, products, or services.

PKPK"8AOEBPS/xstrm_cncpt.htm XStream Concepts

2 XStream Concepts

This chapter contains concepts related to XStream.

This chapter contains these topics:

XStream Out

XStream Out can capture transactions from the redo log of an Oracle database and send them efficiently to a client application. XStream Out provides a transaction-based interface for streaming these changes to client applications. The client application can interact with other systems, including non-Oracle systems, such as non-Oracle databases or file systems.

XStream Out has both OCI and Java interfaces and supports all of the data types that are supported by Oracle Streams, including LOBs, LONG, LONG RAW, and XMLType.

This section contains these topics:

The Outbound Server

With XStream Out, an Oracle Streams apply process functions as an outbound server. An outbound server is an optional Oracle background process that sends database changes to a client application. Specifically, a client application can attach to an outbound server and extract database changes from LCRs. A client application attaches to the outbound server using the OCI or Java interface.

A client application can create multiple sessions. Each session can attach to only one outbound server, and each outbound server can serve only one session at a time. However, different client application sessions can connect to different outbound servers or inbound servers.

In an XStream Out configuration, a capture process captures database changes and sends these changes to an outbound server. A capture process is an optional Oracle background process that scans the database redo log to capture DML and DDL changes made to database objects. When a capture process is configured to capture changes from the redo log, the database where the changes were generated is called the source database for the capture process.

Figure 2-1 shows a capture process.

Figure 2-1 Capture Process

Description of Figure 2-1 follows
Description of "Figure 2-1 Capture Process"

Change capture can be performed on the same database as the outbound server or on a different database. When change capture is performed on a different database from the one that contains the outbound server, a propagation sends the changes from the change capture database to the outbound server database. Downstream capture is also a supported mode to reduce the load on the source database.

When both the capture process and the outbound server are enabled, data changes, encapsulated in row LCRs and DDL LCRs, are sent to the outbound server. The outbound server can publish LCRs in various formats, such as OCI and Java. The client application can process LCRs that are passed to it from the outbound server or wait for LCRs from the outbound server by using a loop.

An outbound server sends LOB, LONG, LONG RAW, and XMLType data to the client application in chunks. Several chunks comprise a single column value of LOB, LONG, LONG RAW, or XMLType data type.

Figure 2-2 shows an outbound server configuration.

Figure 2-2 XStream Out Outbound Server

Description of Figure 2-2 follows
Description of "Figure 2-2 XStream Out Outbound Server"

The client application can detach from the outbound server whenever necessary. When the client application re-attaches, the outbound server automatically determines where in the stream of LCRs the client application was when it detached. The outbound server starts sending LCRs from this point forward.


See Also:

Oracle Streams Concepts and Administration for detailed information about capture processes

Outbound Servers and Apply Process Features

An Oracle Streams apply process functions as an outbound server, but some apply process features are not applicable to an outbound server. The following sections describe which apply process features are applicable to outbound servers and which are not:


See Also:

Oracle Streams Concepts and Administration for information about apply processes

Apply Process Features That Are Applicable to Outbound Servers

The following apply process features can be used with outbound servers:

  • Rules and rule sets

    See Oracle Streams Concepts and Administration.

  • Rule-based transformations

    When a custom rule-based transformation is specified on a rule used by an outbound server, the user who calls the transformation function is the connect user for the outbound server.

    See Oracle Streams Concepts and Administration.

  • The following apply process parameters:

    • apply_sequence_nextval

    • disable_on_limit

    • grouptransops

    • ignore_transaction

    • max_sga_size

    • maximum_scn

    • startup_seconds

    • time_limit

    • trace_level

    • transaction_limit

    • txn_age_spill_threshold

    • txn_lcr_spill_threshold

    • write_alert_log

    These apply process parameters control the behavior of outbound servers.


    Note:

    Starting with Oracle Database 11g Release 2 (11.2.0.2), the following parameters are available: apply_sequence_nextval, ignore_transaction, grouptransops, and max_sga_size.

    See Oracle Database PL/SQL Packages and Types Reference.

  • Transaction assembly by reader servers

    See Oracle Streams Concepts and Administration.

  • The spilling of unapplied LCRs to hard disk

    See Oracle Streams Concepts and Administration.

  • Instantiation system change number (SCN) settings

    Instantiation SCNs are not required for database objects processed by an outbound server. If an instantiation SCN is set for a database object, then the outbound server only sends the LCRs for the database object with SCN values that are greater than the instantiation SCN value. If a database object does not have an instantiation SCN set, then the outbound server skips the instantiation SCN check and sends all LCRs for that database object. In both cases, the outbound server only sends LCRs that satisfy its rule sets.

    See Oracle Streams Replication Administrator's Guide.

Apply Process Features That Are Not Applicable to Outbound Servers

The following apply process features cannot be used with outbound servers:

  • Apply handlers

    You cannot specify an apply handler for an outbound server. The client application can perform custom processing of the LCRs instead if necessary. However, if apply processes are configured in the same database as the outbound server, then you can specify apply handlers for these apply processes. In addition, you can configure general apply handlers for the database. An outbound server ignores general apply handlers.

    See Oracle Streams Concepts and Administration.

  • The following apply process parameters:

    • allow_duplicate_rows

    • commit_serialization

    • compare_key_only

    • disable_on_error

    • parallelism

    • preserve_encryption

    • rtrim_on_implicit_conversion

    Outbound servers ignore the settings for these apply process parameters.

    The commit_serialization parameter is always set to FULL for an outbound server, and the parallelism parameter is always set to 1 for an outbound server.


    Note:

    Starting with Oracle Database 11g Release 2 (11.2.0.2), the compare_key_only parameter is available.

    See Oracle Database PL/SQL Packages and Types Reference.

  • Apply tags

    An outbound server cannot set an apply tag for the changes it processes.

    See Oracle Streams Replication Administrator's Guide.

  • Apply database links

    Outbound servers cannot use database links.

    See Oracle Streams Replication Administrator's Guide.

  • Conflict detection and resolution

    An outbound server does not detect conflicts, and conflict resolution cannot be set for an outbound server.

    See Oracle Streams Replication Administrator's Guide.

  • Dependency scheduling

    An outbound server does not evaluate dependencies because its parallelism must be 1.

    See Oracle Streams Concepts and Administration.

  • Substitute key column settings

    An outbound server ignores substitute key column settings.

    See Oracle Streams Concepts and Administration.

  • Enqueue directives specified by the SET_ENQUEUE_DESTINATION procedure in the DBMS_APPLY_ADM package

    An outbound server cannot enqueue changes into an Oracle database queue automatically using the SET_ENQUEUE_DESTINATION procedure.

    See Oracle Database PL/SQL Packages and Types Reference.

  • Execute directives specified by the SET_EXECUTE procedure in the DBMS_APPLY_ADM package

    An outbound server ignores execute directives.

    See Oracle Database PL/SQL Packages and Types Reference.

  • Error creation and execution

    An outbound server does not create an error transaction when it encounters an error. It records information about errors in the ALL_APPLY and DBA_APPLY views, but it does not enqueue the transaction into the error queue.

    See Oracle Streams Concepts and Administration.

ID Key LCRs


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

XStream Out does not support the following data types in row LCRs:

  • BFILE

  • ROWID

  • User-defined types (including object types, REFs, varrays, and nested tables)

  • XMLType stored object relationally or as binary XML

  • The following Oracle supplied types: Any types, URI types, spatial types, and media types

These data type restrictions pertain to both ordinary (heap-organized) tables and index-organized tables.

ID key LCRs enable an XStream client application to process changes to rows that include unsupported data types. ID key LCRs do not contain all of the columns for a row change. Instead, they contain the rowid of the changed row, a group of key columns to identify the row in the table, and the data for the scalar columns of the table that are supported by XStream Out. ID key LCRs do not contain columns for unsupported data types.

An XStream client application can use ID key LCRs in the following ways:

  • If the application does not require the data in the unsupported columns, then the application can process the values of the supported columns in the ID key LCRs normally.

  • If the application requires the data in the unsupported columns, then the application can use the information in an ID key LCR to query the correct row in the database and consume the unsupported data for the row.

ID Key LCRs Demo

A demo is available that creates a sample client application that process ID key LCRs. Specifically, the client application attaches to an XStream outbound server and waits for LCRs from the outbound server. When the client application receives an ID key LCR, it can query the appropriate source database table using the rowid in the ID key LCR.

The demo is available in the following location in both OCI and Java code:

$ORACLE_HOME/rdbms/demo/xstream/idkey

Sequence LCRs


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

A sequence LCR is a row LCR that includes information about sequence values. Sequence database objects generate sequence values.

You can stream sequence LCRs in the following ways:

  • To capture sequence LCRs using a capture process, set the capture process parameter capture_sequence_nextval to Y.

  • To construct sequence LCRs using the OCI interface, use the OCILCRNew function and the OCILCRHeaderSet function with the OCI_ROWLCR_SEQ_LCR flag.

  • To construct sequence LCRs using the Java interface, use the DefaultRowLCR constructor and setSequenceLCRFlag method.

An apply process or XStream inbound server can use sequence LCRs to ensure that the sequence values at a destination database use the appropriate values. For increasing sequences, the sequence values at the destination are equal to or greater than the sequence values at the source database. For decreasing sequences, the sequence values at the destination are less than or equal to the sequence values at the source database. To instruct an apply process or XStream inbound server to use sequence LCRs, set the apply_sequence_nextval apply process parameter to Y.


Note:

Sequence LCRs are intended for one-way replication configurations. Sequence LCRs cannot be used in bi-directional replication configurations.


See Also:


Considerations for XStream Outbound Servers

The following are considerations for XStream outbound servers:

  • LCRs processed by an outbound server must be LCRs that were captured by a capture process. An outbound server does not support LCRs that were captured by synchronous captures or LCRs that were constructed by applications.

  • A single outbound server can process captured LCRs from only one source database. The source database is the database where the changes encapsulated in the LCRs were generated in the redo log.

  • The source database for the changes captured by a capture process must be at 10.2.0 or higher compatibility level for these changes to be processed by an outbound server.

  • The capture process for an outbound server must be running on an Oracle Database 11g Release 2 (11.2) or later database.

  • A single capture process cannot capture changes for both an outbound server and an apply process. However, a single capture process can capture changes for multiple outbound servers.

  • An outbound server appears as an Oracle Streams apply process in Oracle Enterprise Manager.

  • Automatic split and merge of a stream is possible when the capture process and the outbound server for the stream run on different database instances. However, when the capture process and outbound server for a stream run on the same database instance, automatic split and merge of the stream is not possible. See Oracle Streams Replication Administrator's Guide for information about automatic split and merge.

XStream Out and Distributed Transactions

You can perform distributed transactions using either of the following methods:

  • Modify tables in multiple databases in a coordinated manner using database links.

  • Use the XA interface, as exposed by the DBMS_XA supplied PL/SQL package or by the OCI or JDBC libraries. The XA interface implements X/Open Distributed Transaction Processing (DTP) architecture.

In an XStream Out configuration, changes made to the source database during a distributed transaction using either of the preceding methods are streamed to an XStream outbound server. The outbound server sends the changes in a transaction to the XStream client application after the transaction has committed.

However, the distributed transaction state is not replicated or sent. The client application does not inherit the in-doubt or prepared state of such a transaction. Also, XStream does not replicate or send the changes using the same global transaction identifier used at the source database for XA transactions.

XA transactions can be performed in two ways:

  • Tightly coupled, where different XA branches share locks

  • Loosely coupled, where different XA branches do not share locks

XStream supports replication of changes made by loosely coupled XA branches regardless of the COMPATIBLE initialization parameter value. XStream supports replication of changes made by tightly coupled branches on an Oracle RAC source database only if the COMPATIBLE initialization parameter is set to 11.2.0 or higher.


See Also:


XStream In

XStream In enables a remote client application to send information into an Oracle database from another system, such as a non-Oracle database or a file system. XStream In provides an efficient, transaction-based interface for sending information to an Oracle database from client applications. XStream In can consume the information coming into the Oracle database in several ways, including data replication, auditing, and change data capture. XStream In supports both OCI and Java interfaces.

When compared with OCI client applications that make DML changes to an Oracle database directly, XStream In is more efficient for near real-time, transaction-based, heterogeneous DML changes to Oracle databases.

XStream In uses the following features of Oracle Streams:

XStream In supports all of the data types that are supported by Oracle Streams, including LOBs, LONG, LONG RAW, and XMLType. A client application sends LOB and XMLType data to the inbound server in chunks. Several chunks comprise a single column value of LOB, LONG, LONG RAW, or XMLType data type.

This section contains these topics:

The Inbound Server

With XStream In, an Oracle Streams apply process functions as an inbound server. An inbound server is an optional Oracle background process that receives LCRs from a client application. Specifically, a client application can attach to an inbound server and send row changes and DDL changes encapsulated in LCRs.

An external client application connects to the inbound server using the OCI or the Java interface. After the connection is established, the client application acts as the capture agent for the inbound server by streaming LCRs to it.

A client application can create multiple sessions. Each session can attach to only one inbound server, and each inbound server can serve only one session at a time. However, different client application sessions can connect to different inbound servers or outbound servers. A client application can detach from the inbound server whenever necessary.

Figure 2-3 shows an inbound server configuration.

Figure 2-3 XStream In Inbound Server

Description of Figure 2-3 follows
Description of "Figure 2-3 XStream In Inbound Server"


Note:

An inbound server uses a queue that is not shown in Figure 2-3. An inbound server's queue is only used to store error transactions.

Considerations for XStream Inbound Servers

The following are considerations for XStream inbound servers:

  • You can control a DML or DDL trigger's firing property using the SET_TRIGGER_FIRING_PROPERTY procedure in the DBMS_DDL package. This procedure lets you specify whether a trigger always fires, fires once, or fires for apply process changes only. When a trigger is set to fire once, it fires for changes made by a user process, but it does not fire for changes made by an apply process or inbound server. A trigger's firing property works the same for apply processes and inbound servers. See Oracle Streams Concepts and Administration.

  • An inbound server ignores the setting for the ignore_transaction apply process parameter because LCRs sent to the inbound server by the client application might not have transaction ID values.


    Note:

    Starting with Oracle Database 11g Release 2 (11.2.0.2), the ignore_transaction parameter is available for outbound servers and apply processes.

  • An inbound server ignores the setting for the maximum_scn apply process parameter because LCRs sent to the inbound server by the client application might not have SCN values.

  • Currently, an inbound server appears as an Oracle Streams apply process in Oracle Enterprise Manager.


See Also:

Oracle Database PL/SQL Packages and Types Reference for more information about apply process parameters

Position Order in an LCR Stream

The following sections describe the position order in an LCR stream for both XStream Out and XStream In:

About Position Order

Both XStream Out and XStream In use LCR streams to share transactions. XStream Out sends LCR streams to a client application. XStream In receives LCR streams from a client application.

Each LCR has a position attribute. The position of an LCR identifies its placement in the stream of LCRs in a transaction. Each LCR position has the following properties:

  • The position is unique for each LCR.

  • The position is of RAW data type.

  • The position is strictly increasing within the LCR stream, within a transaction, and across transactions.

  • The position is byte-comparable, and the comparison results for multiple positions determines the ordering of the LCRs in the stream.

  • The position of an LCR remains identical when the database, the client application, or an XStream component restarts.

  • The position is not affected by any rule changes that might reduce or increase the number of LCRs in the stream.

XStream Out only sends committed data, and XStream In only receives committed data.

The following are the properties related to an LCR stream:

  • An LCR stream must be repeatable.

  • An LCR stream must contain a list of assembled, committed transactions. LCRs from one transaction are contiguous. There is no interleaving of transactions in an LCR stream.

  • Each transaction within an LCR stream must have an ordered list of LCRs and a transaction ID.

  • The last LCR in each transaction must be a commit LCR.

  • Each LCR must have a unique position.

  • The position of all LCRs within a single transaction and across transactions must be strictly increasing.

An LCR stream can batch LCRs from multiple transactions and arrange them in increasing position order. LCRs from one transaction are contiguous, and the position must be increasing in the transaction. Also, the position must be nonzero for all LCRs.

Position of LCRs and XStream Out

An XStream Out outbound server streams LCRs that were captured by a capture process to a client application. This section describes concepts related to the LCR positions for an outbound server.

Additional LCR Attributes Related to Position

LCRs that were captured by a capture process contain the following additional attributes related to LCR position:

  • The scn_from_position attribute contains the SCN of the LCR.

  • The commit_scn_from_position attribute contains the commit SCN of the transaction to which the LCR belongs.


Note:

The scn_from_position and commit_scn_from_position attributes are not present in row LCRs captured by a synchronous capture nor in explicitly captured row LCRs.

The Processed Low Position and Restartability for XStream Out

If the outbound server or the client application stops abnormally, then the connection between the two is broken automatically. In this case, the client application must roll back all incomplete transactions.

The processed low position is a position below which all transactions have been processed by the client application. The client application must maintain its processed low position to recover properly after either it or the outbound server (or both) are restarted. The processed low position indicates that the client application has processed all LCRs that are less than or equal to this value. The client application can update the processed low position for each transaction that it consumes.

When the client application attaches to the outbound server, the following conditions related to the processed low position are possible:

  • The client application can pass a processed low position to the outbound server that is equal to or greater than the outbound server's processed low position. In this case, the outbound server resumes streaming LCRs from the first LCR that has a position greater than the client application's processed low position.

  • The client application can pass a processed low position to the outbound server that is less than the outbound server's processed low position. In this case, the outbound server raises an error.

  • The client application can pass NULL to the outbound server. In this case, the outbound server determines the processed low position automatically and starts streaming LCRs from the LCR that has a position greater than this processed low position. When this happens, the client application must suppress or discard each LCR with a position less than or equal to the client application's processed low position.

Streaming Network Transmission

To minimize network latency, the outbound server streams LCRs to the client application with time-based acknowledgments. For example, the outbound server might send an acknowledgment every 30 seconds. This streaming protocol fully utilizes the available network bandwidth, and the performance is unaffected by the presence of a wide area network (WAN) separating the sender and the receiver. The outbound server extends the underlying Oracle Streams infrastructure, and the outbound server maintains the streaming performance rate.

Using OCI, you can control the time period of the interval by setting the OCI_ATTR_XSTREAM_ACK_INTERVAL attribute through the OCI client application. The default is 30 seconds.

Using Java, you can control the time period of the interval by setting the batchInterval parameter in the attach method in the XStreamOut class. The client application can specify this interval when it invokes the attach method.

If the interval is large, then the outbound server can stream out more LCRs for each acknowledgment interval. However, a longer interval delays how often the client application can send the processed low position to the outbound server. Therefore, a longer interval might mean that the processed low position maintained by the outbound server is not current. In this case, when the outbound server restarts, it must start processing LCRs at an earlier position than the one that corresponds to the processed low position maintained by the client application. Therefore, more LCRs might be retransmitted, and the client application must discard the ones that have been applied.

Position of LCRs and XStream In

A client application streams LCRs to an XStream In inbound server. This section describes concepts related to the LCR positions for an inbound server.

Each position must be encoded in a format (such as base-16 encoding) that supports byte comparison. The position is essential to the total order of the transaction stream sent by client applications using the XStream In interface.

The following positions are important for inbound servers:

  • The applied low position indicates that the LCRs less than or equal to this value have been applied.

    An LCR is applied by an inbound server when the LCR has either been executed, sent to an apply handler, or moved to the error queue.

  • The spill position indicates that the LCRs with positions less than or equal to this value have either been applied or spilled from memory to hard disk.

  • The applied high position indicates the highest position of an LCR that has been applied.

    When the commit_serialization apply process parameter is set to DEPENDENT_TRANSACTIONS for an inbound server, an LCR with a higher commit position might be applied before an LCR with a lower commit position. When this happens, the applied high position is different from the applied low position.

  • The processed low position is the higher value of either the applied low position or the spill position.

    The processed low position is the position below which the inbound server no longer requires any LCRs. This position corresponds with the oldest SCN for an Oracle Streams apply process that applies changes captured by a capture process.

    The processed low position indicates that the LCRs with positions less than or equal to this position have been processed by the inbound server. If the client re-attaches to the inbound server, then it must send only LCRs with positions greater than the processed low position because the inbound server discards any LCRs with positions less than or equal to the processed low position.

If the client application stops abnormally, then the connection between the client application and the inbound server is automatically broken. Upon restart, the client application retrieves the processed low position from the inbound server and instructs its capture agent to retrieve changes starting from this processed low position.

To limit the recovery time of a client application using the XStream In interface, the client application can send activity, such as empty transactions, periodically to the inbound server. Row LCRs can include commit transaction control directives. When there are no LCRs to send to the server, the client application can send a row LCR with a commit directive to advance the inbound server's processed low position. This activity acts as an acknowledgment so that the inbound server's processed low position is advanced.

Example 2-1 Advancing the Processed Low Position of an Inbound Server

Consider a client application and an external data source. The client application sends changes made to the hr.employees table to the inbound server for processing, but the external data source includes many other tables, including the oe.orders table.

Assume that the following changes are made to the external data source:

PositionChangeClient Application Activity
1Insert into the hr.employees tableSend row LCR including the change to the inbound server
2Insert into the oe.orders tableNone
3CommitSend a row LCR with a commit directive to inbound server
4Insert into the oe.orders tableNone
5Update the oe.orders tableNone
6CommitNone
7CommitNone
...... (Activity on the external data source, but no changes to the hr.employees table)None
100Insert into the oe.orders tableNone
101CommitNone

The client application gets the changes from the external data source, generates appropriate LCRs, and sends the LCRs to the inbound server. Therefore, the inbound server receives the following LCRs:

  • Row LCR for position 1

  • Row LCR for position 3

After position 3, there are no relevant changes to send to the inbound server. If the inbound server restarts when the client application has processed all the changes up to position 101, then, after restarting, the client application must recheck all of the external database changes from position 4 forward. The rechecks are required because the inbound server's processed low position is 3.

Instead, assume that the client application sends commits to the inbound server periodically, even when there are no relevant changes to the hr.employees table:

PositionChangeClient Application Activity
1Insert into the hr.employees tableSend row LCR including the change to the inbound server
2Insert into the oe.orders tableNone
3CommitSend a row LCR with a commit directive to inbound server
4Insert into the oe.orders tableNone
5Update the oe.orders tableNone
6CommitNone
7CommitNone
...... (Activity on the external data source, but no changes to the hr.employees table)Send several row LCRs, each one with a commit directive, to the inbound server
100Insert into the oe.orders tableNone
101CommitSend a row LCR with a commit directive to the inbound server

In this case, the inbound server moves its processed low position to 101 when it has processed all of the row LCRs sent by the client application. If the inbound server restarts, its processed low position is 101, and the client application does not need to check all of the changes back to position 3.

The sample applications in "Sample XStream Client Application" include code that sends a row LCR with a commit directive to an inbound server. These commit directives are sometimes called "ping LCRs." Search for the word "ping" in the sample XStream client applications to find the parts of the applications that include this code.

Summary of Position Use in XStream Out and XStream In

Table 2-1 compares how an XStream Out outbound server and an XStream In inbound server use positions.

Table 2-1 Position Use in the Outbound Server and the Inbound Server

XStream Out Outbound ServerXStream In Inbound Server

The outbound server exposes the position.

The client application sets the position.

If the outbound server or client application stops abnormally, then all LCRs above the processed low position are resent. The processed low position is equivalent to an apply process low watermark (LWM), and the apply process obtains the oldest SCN value by using this value.

If the inbound server or client application stops abnormally, then the client application must retransmit all LCRs with a position greater than or equal to the processed low position. The processed low position is equivalent to the apply process low water mark (LWM).


XStream and SQL Generation

SQL generation is the ability to generate the SQL statement required to perform the change encapsulated in a row LCR. Apply processes, XStream outbound servers, and XStream inbound servers can use SQL generation to generate the SQL statement necessary to perform the insert, update, or delete operation in a row LCR.

This section contains these topics:

Interfaces for Performing SQL Generation

You can use the following interfaces to perform SQL generation:

  • The PL/SQL interface, which uses the GET_ROW_TEXT and GET_WHERE_CLAUSE member procedures for row LCRs

  • The OCI for XStream

  • The Java interface for XStream

The PL/SQL interface generates SQL in a CLOB data type, while the OCI and Java interfaces generate SQL in plain text. In the Java interface, the size of the text is limited by the size of String data type.


See Also:


SQL Generation Formats

SQL statements can be generated in one of two formats: inline values or bind variables. Use inline values when the returned SQL statement is relatively small. For larger SQL statements, use bind variables. In this case, the bind variables are passed to the client application in a separate list that includes pointers to both old and new column values.

For information about using bind variables with each interface, refer to the following documentation:


Note:

For generated SQL statements with the values inline, SQL injection is possible. SQL injection is a technique for maliciously exploiting applications that use client-supplied data in SQL statements, thereby gaining unauthorized access to a database to view or manipulate restricted data. Oracle strongly recommends using bind variables if you plan to execute the generated SQL statement. See Oracle Database PL/SQL Language Reference for more information about SQL injection.

Data Types and Character Sets

Regarding data types and character sets, SQL generation works the same way for XStream Out outbound servers, XStream In inbound servers, and apply processes. For detailed information, see Oracle Streams Concepts and Administration.

SQL Generation Demo

A demo that performs SQL generation is available. The demo uses the DBMS_XSTREAM_ADM PL/SQL package to configure an XStream Out environment, and it uses an OCI client application to perform SQL generation.

The demo uses SQL generation to replicate DML changes from a source database to a destination database. Specifically, the demo creates the xsdemosg schema in both the source database and the destination database. It creates various types of tables in the xsdemosg schema at each database, including tables with LOB columns. It executes a set of DML statements on the tables in xsdemosg schema in the source database. Oracle Streams components, such as a capture process and a queue, send the changes in the form of LCRs to an XStream outbound server that is also running on the source database. The outbound server makes the LCRs available to the demo client application.

The demo client application, when run, uses the OCI API to connect to the outbound server and receive the LCRs. The demo client application uses SQL generation to execute the changes that are encapsulated in the LCRs. Therefore, the client application replicates the changes made to xsdemosg schema in the source database to the xsdemosg in the destination database.

You can modify the demo to replicate changes to any schema. Both the schema and the replicated tables must exist on both the source database and the destination database. SQL generation is only possible for DML changes. Therefore, this demo cannot be used to replicate DDL changes.

This demo is available in the following location:

$ORACLE_HOME/rdbms/demo/xstream/sqlgen

Note:

The SQL generation demo is not available for the XStream Java API.

XStream and Security

XStream Out allows a user to receive LCRs. After an XStream Out user receives LCRs, the user might save the contents of LCRs to a file or generate the SQL statements to execute the LCRs on a non-Oracle database. XStream In allows a user to update tables in its own schema. XStream does not assume that the connected user to the outbound server or inbound server is trusted.

Java and OCI client applications must connect to an Oracle database before attaching to an XStream outbound server created on that database. The connected user must be the same as the connect user configured for the outbound server. Otherwise, an error is raised.

Java and OCI client applications must connect to an Oracle database before attaching to an XStream inbound server created on that database. The connected user must be the same as the apply user configured for the inbound server. Otherwise, an error is raised.

The XStream Java layer API relies on Oracle JDBC security because XStream accepts the Oracle JDBC connection instance created by client applications in the XStream attach API. The connected user is validated as an XStream user.


See Also:


Other Ways to Share Information in a Heterogeneous Environment

Oracle Streams provides other ways to implement heterogeneous information sharing besides XStream, both in past releases and in the current release. These ways include:

PK"@& &PK"8AOEBPS/xstrm_trouble.htmn Troubleshooting XStream

7 Troubleshooting XStream

This chapter describes common problems you might encounter while using XStream and explains how to solve them.

This chapter contains the following topics:

Diagnosing Problems with XStream

With XStream, an Oracle Streams apply process can function as an outbound server or an inbound server. An XStream configuration can also include other components, such as capture processes, queues, propagations, rules, and rule-based transformations.

To diagnose problems with XStream, you can use many of the same techniques that are used to diagnose problems with Oracle Streams components. These techniques include the following:

See Oracle Streams Concepts and Administration for detailed information about these topics.

Problems and Solutions for XStream

In general, you can troubleshoot XStream outbound servers and inbound servers in the same way that you troubleshoot Oracle Streams apply processes. In addition, an XStream Out environment includes capture processes and queues, and might include other components, such as propagations, rules, and rule-based transformations. To troubleshoot these components, see the troubleshooting documentation in Oracle Streams Concepts and Administration.

This section describes common problems and solutions for XStream.

This section contains the following topics:

An OCI Client Application Cannot Attach to the Outbound Server

An XStream client application cannot attach to an outbound server using the Oracle Call Interface (OCI) OCIXStreamOutAttach() function.

The following sections describe possible problems and their solutions.

Problem 1: Client Application Not Connected as Connect User

The client application is not connected as the outbound server's connect user to the outbound server's database. The client application connected to the database as a different user.

Solution 1

To correct problem 1: 

  • Modify the client application to connect to the database as the connect user before attaching to the outbound server.

Problem 2: Client Application Not Passing Service Handle

The client application is not passing a service handle to the outbound server.

Solution 2

To correct problem 2: 

  • Modify the client application so that it passes a service handle using OCISvcCtx and not OCIServer.

Changes Are Failing to Reach the Client Application in XStream Out

In an XStream Out configuration, database changes that should be captured and streamed to the XStream client application are not reaching the client application.

The following sections describe possible problems and their solutions.

Problem 1: Capture Process Has Fallen Behind

The capture process has fallen behind.

To determine whether the capture process has fallen behind: 

  1. Connect to the outbound server database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following query:

    COLUMN CAPTURE_NAME HEADING 'Capture|Name' FORMAT A15
    COLUMN CREATE_MESSAGE HEADING 'Last LCR|Create Time'
    COLUMN ENQUEUE_MESSAGE HEADING 'Last|Enqueue Time'
    
    SELECT CAPTURE_NAME,
           TO_CHAR(CAPTURE_MESSAGE_CREATE_TIME, 'HH24:MI:SS MM/DD/YY') CREATE_MESSAGE,
           TO_CHAR(ENQUEUE_MESSAGE_CREATE_TIME, 'HH24:MI:SS MM/DD/YY') ENQUEUE_MESSAGE
      FROM V$STREAMS_CAPTURE;
    

    This query displays the time when the capture process last created a logical change record (LCR) and the time when the capture process last enqueued an LCR. If the times returned are before the time when the database changes were made, then the capture process must catch up and capture the changes.

Solution 1

No action is required. Normally, the capture process will catch up on its own without the need for intervention.

Problem 2: Rules or Rule-Based Transformation Excluding Changes

Rules or rule-based transformations are excluding the changes that should be captured.

Rules determine which LCRs are captured by a capture process, sent from a source queue to a destination queue by a propagation, and sent to an XStream client application by an outbound server. If the rules are not configured properly, then the client application might not receive the LCRs it should receive. The client application might also receive LCRs that it should not receive.

Rule-based transformations modify the contents of LCRs. Therefore, if the expected change data is not reaching the client application, it might be because a rule-based transformation modified the data or deleted the data. For example, a DELETE_COLUMN declarative rule-based transformation removes a column from an LCR.

Solution 2

To correct problem 2: 

  • Check the rules and rule-based transformations that are configured for each component in the stream from the capture process to the client application, and correct any problems.

Problem 3: LCRs Blocked in the Stream

If the capture process has not fallen behind, and there are no problems with rules or rule-based transformations, then LCRs might be blocked in the stream for some other reason. For example, a propagation or outbound server might be disabled, a database link might be broken, or there might be another problem.

You can track an LCR through a stream using one of the following methods:

  • Setting the message_tracking_frequency capture process parameter to 1 or another relatively low value

  • Running the SET_MESSAGE_TRACKING procedure in the DBMS_STREAMS_ADM package

After using one of these methods, use the V$STREAMS_MESSAGE_TRACKING view to monitor the progress of LCRs through the stream. By tracking an LCR through the stream, you can determine where the LCR is blocked.

Solution 3

To correct problem 3: 

  • Take the appropriate action based on the reason that the LCR is blocked. For example, if a propagation is disabled, then enable it.


See Also:


LCRs Streaming from an Outbound Server Are Missing Extra Attributes

LCRs streaming from an outbound server are expected to include extra attributes, but these attributes are not included in the LCRs.

LCRs can contain the following extra attributes related to database changes:

  • row_id

  • serial#

  • session#

  • thread#

  • tx_name

  • username

By default, a capture process does not capture these extra attributes. If you want extra attributes to be included in LCRs streamed from an outbound server to an XStream client application, but the LCRs do not contain values for extra attributes, then make sure the capture process that captures changes for the outbound server is configured to capture values for the extra attributes.

The following sections describe the possible problem and its solution.

Problem: Capture Process Not Configured to Capture Extra Attributes

The capture process is not configured to capture the required extra attributes.

To display the extra attributes currently being captured by the capture processes in a database: 

  1. Connect to the database running the capture process as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following query:

    COLUMN CAPTURE_NAME HEADING 'Capture Process' FORMAT A30
    COLUMN ATTRIBUTE_NAME HEADING 'Attribute Name' FORMAT A30
     
    SELECT CAPTURE_NAME, ATTRIBUTE_NAME
      FROM DBA_CAPTURE_EXTRA_ATTRIBUTES
      WHERE INCLUDE = 'YES'
      ORDER BY CAPTURE_NAME;
    

    If an extra attribute is not displayed by this query, then it is not being captured.

Solution

To solve the problem, configure the capture process to capture the required extra attributes: 

  1. Connect to the outbound server database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the INCLUDE_EXTRA_ATTRIBUTE procedure in the DBMS_CAPTURE_ADM package.

Example 7-1 Including the tx_name Attribute for the Capture Process xcapture

BEGIN
  DBMS_CAPTURE_ADM.INCLUDE_EXTRA_ATTRIBUTE(
    capture_name   => 'xcapture',
    attribute_name => 'tx_name',
    include        => TRUE);
END;
/

The XStream Out Client Application Is Unresponsive

The XStream client application in an XStream Out configuration is unresponsive.

The following sections describe the possible problem and its solution.

Problem 1: Streams Pool Size Is Too Small

The Streams pool size might be too small.

To determine whether the Streams pool size is too small: 

  1. Connect to the outbound server database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following queries at the database that contains the outbound server:

    • Query the V$PROPAGATION_RECEIVER view.:

      SELECT STATE FROM V$PROPAGATION_RECEIVER;
      

      If the state is WAITING FOR MEMORY, then consider increasing the Streams pool size.

    • Query the V$STREAMS_POOL_STATISTICS view.:

      SELECT TOTAL_MEMORY_ALLOCATED/CURRENT_SIZE FROM V$STREAMS_POOL_STATISTICS;
      

      If the value returned is .90 or greater, then consider increasing the Streams pool size.

    • If the outbound server receives changes from a capture process that is running on the same database, then query the V$STREAMS_CAPTURE view.:

      SELECT STATE FROM V$STREAMS_CAPTURE;
      

      If the state is WAITING FOR BUFFER QUEUE TO SHRINK, then increase the Streams pool size.

Solution 1

To correct problem 1: 

  • Increase the Streams pool size by modifying the STREAMS_POOL_SIZE initialization parameter or by modifying other initialization parameters related to memory.


See Also:


Problem 2: Programming Errors

If there is enough memory in the Streams pool, then check your client application for programming errors.

Solution 2

To correct problem 2: 

  • Correct the programming errors.

XStream In Cannot Identify an Inbound Server

If an XStream In configuration cannot identify an inbound server, then the following error is returned:

ORA-26840: STREAMS unable to identify an apply for the source database "%s"

The following sections describe the possible problem and its solution.

Problem: Multiple Subscribers to the Inbound Server's Queue

The ORA-26840 error indicates that there are multiple subscribers to the queue used by the inbound server. Subscribers can include inbound servers, outbound servers, apply processes, and propagations.

To determine whether there are multiple subscribers to the inbound server's queue: 

  1. Connect to the inbound server database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following query:

    SELECT APPLY_NAME SUBSCRIBER, QUEUE_NAME FROM DBA_APPLY UNION
      SELECT PROPAGATION_NAME, SOURCE_QUEUE_NAME
      FROM DBA_PROPAGATION
      ORDER BY QUEUE_NAME;
    

    You can add a WHERE clause to the query to limit the output to the inbound server's queue.

Solution

To correct the problem: 

  • If the query returns multiple subscribers to the inbound server's queue, then reconfigure the subscribers so that the inbound server is the only subscriber.

Changes Are Not Being Applied by an Inbound Server

In an XStream In configuration, database changes are sent in the form of LCRs from the XStream client application to an inbound server.

The following sections describe the possible problem and its solution.

Problem: LCRs Blocked During Apply

If the inbound server is not applying the changes, then the LCRs are blocked during apply. For example, the inbound server might be disabled, an apply handler might be processing LCRs incorrectly, or there might be another problem.

You can track an LCR during apply by an inbound server using the following methods:

  • If the client application uses the XStream OCI API, then use the OCI_LCR_ATTR_MESSAGE_TRACKING_LABEL attribute in the OCILCRAttributesSet function to set tracking label, and use the OCIXStreamInLCRSend function to send LCRs.

    The following is sample code for setting message tracking for LCRs using the OCI API:

    static void set_msg_tracking(myctx_t  *ctx, void *lcr, oratext *label)
    {
     oci_t      *ocip = ctx->ocip;
     oratext    *attr_names[] = {OCI_LCR_ATTR_MESSAGE_TRACKING_LABEL};
     ub2         attr_names_lens[] =
                                
    {sizeof(OCI_LCR_ATTR_MESSAGE_TRACKING_LABEL)-1};
     ub2         dty[] = {SQLT_CHR};
     OCIInd      ind[] = {OCI_IND_NOTNULL};
     void       *data[1];
     ub2         data_lens[1];
     
     data[0] = label;
     data_lens[0] = strlen(label);
     
     OCICALL(ocip,
             OCILCRAttributesSet(ocip->svcp, ocip->errp, 1, attr_names,
                                 attr_names_lens, dty, data, ind, data_lens,
                                 lcr, OCI_DEFAULT));
    }
     
    /*---------------------------------------------------------------------
    * send_lcr - Send the given lcr and bump up lcr position.
    *---------------------------------------------------------------------*/
    static void send_lcr(myctx_t  *ctx, void *lcr, ub1 lcrtype)
    {
     oci_t      *ocip = ctx->ocip;
     
     set_msg_tracking(ctx, lcr, "tracking_label");
     
     OCICALL(ocip,
             OCIXStreamInLCRSend(ocip->svcp, ocip->errp, lcr, lcrtype,
                                 0, OCI_DEFAULT));
     ctx->lcr_pos++;
    }
    

    Using this sample code, to enable message tracking, add the set_msg_tracking procedure to the client application, call set_msg_tracking from the send_lcr procedure when LCRs should be tracked. Replace tracking_label with the string you want to use for the tracking label.

  • If the client application uses the XStream Java API, then use the setMessageTrackingLabel method.

    The following is sample code for setting message tracking for LCRs using the Java API:

    {
       ((AbstractLCR)lcr).setMessageTrackingLabel("tracking_label");
    }
    

    Replace tracking_label with the string you want to use for the tracking label.

After using one of these methods, use the V$STREAMS_MESSAGE_TRACKING view to monitor the progress of LCRs through a stream. By tracking an LCR, you can determine where the LCR is blocked.


Note:

If the LCRs originated from an XStream Out configuration, then the easiest way to track the LCRs is by using the methods described in "Changes Are Failing to Reach the Client Application in XStream Out".

Solution

To correct the problem: 

  • Take the appropriate action based on the reason that the LCR is blocked. For example, if the inbound server is disabled, then enable it.

How to Get More Help with XStream

You can check My Oracle Support at http://support.oracle.com for more solutions to your problem.

You can visit http://www.oracle.com/support/contact.html for more information about Oracle Support.

PK$onPK"8AOEBPS/xstrm_pt_oci.htmK XStream OCI API Reference

Part IV

XStream OCI API Reference

This part contains the XStream OCI API reference. This part contains the following chapters:

PK[۵PKPK"8AOEBPS/xstrm_pt_concepts.htm XStream Concepts and Use Cases

Part I

XStream Concepts and Use Cases

This part contains the following chapters:

PKPK"8AOEBPS/preface.htmK Preface

Preface

Oracle Database XStream Guide describes the features and functionality of XStream. This document contains conceptual information about XStream, along with information about configuring and managing an XStream environment. In addition, this document contains reference information related to XStream.

Audience

This guide is intended for database administrators who configure and manage XStream environments. To use this document, database administrators must be familiar with relational database concepts, SQL, distributed database administration, Oracle Streams concepts, PL/SQL, and the operating systems under which they run an XStream environment.

This guide is also intended for programmers who develop applications that use XStream. To use this document, programmers need knowledge of an application development language and relational database concepts.

Documentation Accessibility

For information about Oracle's commitment to accessibility, visit the Oracle Accessibility Program website at http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc.

Access to Oracle Support

Oracle customers have access to electronic support through My Oracle Support. For information, visit http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info or visit http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs if you are hearing impaired.

Related Documents

For more information, see the following documents:

Many of the examples in this book use the sample schemas of the sample database, which is installed by default when you install Oracle Database. Refer to Oracle Database Sample Schemas for information about how these schemas were created and how you can use them yourself.

Conventions

The following text conventions are used in this document:

ConventionMeaning
boldfaceBoldface type indicates graphical user interface elements associated with an action, or terms defined in text or the glossary.
italicItalic type indicates book titles, emphasis, or placeholder variables for which you supply particular values.
monospaceMonospace type indicates commands within a paragraph, URLs, code in examples, text that appears on the screen, or text that you enter.

PKPK"8AOEBPS/xstrm_use.htm-h XStream Use Cases

3 XStream Use Cases

XStream provides a flexible infrastructure for sharing information between Oracle data sources and non-Oracle data sources. Therefore, you can use XStream in many different ways to meet the needs of various organizations. This chapter describes the most common use cases for XStream.

This chapter contains these topics:

Introduction to XStream Use Cases

Each XStream use case in this chapter contains three main elements:

In some cases, a section includes a reference to sample code in the Oracle Database installation that illustrates a scenario.

XStream Out Use Cases

In each XStream Out use case, the following components and actions send Oracle Database changes to a client application:

  • Oracle Streams captures data changes made to an Oracle database.

  • Oracle Streams sends these changes, in the form of logical change records (LCRs), to an outbound server.

  • The outbound server sends the LCRs to a client application.

How the client application processes the LCRs is different for each use case.


See Also:

"XStream Out"

XStream In Use Cases

In each XStream In use case, the following components and actions send Oracle Database changes to an inbound server:

  • A client application gathers data changes from an external data source and sends them to an inbound server in the form of LCRs.

  • The inbound server receives the LCRs from a client application.

  • The inbound server can apply the data changes to database objects in an Oracle database. The inbound server can also process the LCRs in a customized way.

How the client application gathers the data changes is different for each use case.


See Also:

"XStream In"

Replicating Data Changes with Non-Oracle Databases

You can configure a heterogeneous replication environment with XStream. Replication is generally used to improve availability and to improve performance by spreading the network load over multiple regions and servers. In a heterogeneous replication environment, data is replicated between databases from different vendors. See Oracle Streams Replication Administrator's Guide for common reasons to use replication.

XStream Out can send data changes made to an Oracle database to a non-Oracle database. Specifically, the client application connects to the outbound server and receives changes made to tables within the Oracle database. The client application then applies the data changes in the LCRs to the non-Oracle database. The client application can process the LCRs in any customized way before applying them.

XStream In can receive data changes made to a non-Oracle database. Specifically, the client application gathers the data changes made to the non-Oracle database, formats these changes into LCRs, and sends these LCRs to an inbound server. The inbound server applies the changes in the LCRs to the Oracle database.

Using Files to Store Data Changes

Some environments use files to store data changes. Typically, files store data changes for the following reasons:

XStream Out can send Oracle Database changes to a file in a file system. Specifically, the client application writes the data changes in LCRs to the file. The client application can process the LCRs in any customized way before writing them to the file, and the file can reside on the computer system running the client application or on a different computer system. Using SQL generation, the client application can also write the SQL statement required to perform the change encapsulated in a row LCR to a file.

XStream In can send data changes from a file to an Oracle database. Specifically, the client application reads the data changes from the file and sends the changes, in the form of LCRs, to an inbound server.

XStream Demo That Replicates Database Changes Using Files

A demo is available that creates sample client applications that perform file-based replication using the XStream APIs. Specifically, at one database, the demo creates an XStream Out configuration that captures database changes and sends the LCRs to an outbound server. A client application attaches to the outbound server and writes the database changes to a file.

At a different database, the demo creates an XStream In client application that attaches to an inbound server, reads the changes in the file, and sends them in the form of LCRs to the inbound server. The inbound server applies the changes to the database objects at the destination database.

This demo is available in the following location:

$ORACLE_HOME/rdbms/demo/xstream/fbr

Sharing Data Changes with a Client-Side Memory Cache

Some environments cache data in memory to improve performance. Cached data can provide low response times and high throughput for systems that require the best possible performance. XStream can share data changes incrementally with a client side memory cache.

XStream Out can incrementally refresh a client-side memory cache by sending Oracle database changes to a memory cache. Specifically, the client application applies the data changes in the LCRs to the memory cache. The client application can process the LCRs in any customized way before applying them, and the memory cache can reside on the computer system running the client application or on a different computer system.

XStream In can incrementally retrieve data changes from a memory cache. Specifically, the client application retrieves the data changes and sends the changes, in the form of LCRs, to an inbound server. The memory cache can reside on the computer system running the client application or on a different computer system.

PKd--PK"8AOEBPS/index.htm Index

Index

A  C  D  E  G  I  L  O  P  R  S  T  U  V  X 

A

ADD_OUTBOUND procedure, 4.2.1.2, 8
ADD_SUBSET_OUTBOUND_RULES procedure, 5.2.2.1.2, 8
ALL_APPLY view, 12.1
ALL_APPLY_ERROR view, 12.2
ALL_APPLY_ERROR_MESSAGES view, 12.3
ALL_CAPTURE view, 12.4
ALL_XSTREAM_INBOUND view, 12.5
ALL_XSTREAM_INBOUND_PROGRESS view, 12.6
ALL_XSTREAM_OUTBOUND view, 12.7
ALL_XSTREAM_OUTBOUND_PROGRESS view, 12.8
ALL_XSTREAM_RULES view, 12.9
ALTER_INBOUND procedure, 5.3.1, 8
ALTER_OUTBOUND procedure, 5.2.2.1.1, 5.2.2.2.1, 5.2.3, 5.2.4, 5.2.5, 5.2.5, 8
apply handlers, 2.1.1.1.2, 2.2
apply process
inbound servers, 2.2.1
outbound servers, 2.1.1.1
apply user
XStream In, 5.3.1
ARCHIVELOG mode
XStream Out, 4.1.2.2.3

C

capture process, 2.1.1
capture user
changing, 5.2.4
start SCN
changing, 5.2.5
start time
changing, 5.2.5
table support, 12.18
capture user
XStream Out, 5.2.4
character sets
SQL generation, 2.4.3
XStream OCI interface, 10.1.4
client applications
XStream
example, 4.4
commit_scn_from_position LCR attribute, 2.3.2.1
conflict resolution, 2.1.1.1.2, 2.2
CREATE_INBOUND procedure, 4.3, 8
CREATE_OUTBOUND procedure, 4.2.1.1, 8

D

data types
SQL generation, 2.4.3
XStream In, 2.2
XStream Out, 2.1
database links
XStream Out, 4.1.2.2.2
DBA_APPLY view, 6.3.2, 6.4.2, 12.10
DBA_APPLY_ERROR view, 12.11
DBA_APPLY_ERROR_MESSAGES view, 12.12
DBA_APPLY_SPILL_TXN view, 12.13
DBA_CAPTURE view, 12.14
DBA_CAPTURE_EXTRA_ATTRIBUTES view, 7.2.3
DBA_PROPAGATION view, 7.2.5
DBA_XSTREAM_ADMINISTRATOR view, 12.15
DBA_XSTREAM_INBOUND view, 6.4.1, 12.16
DBA_XSTREAM_INBOUND_PROGRESS view, 6.4.3, 12.17
DBA_XSTREAM_OUT_SUPPORT_MODE view, 12.18
DBA_XSTREAM_OUTBOUND view, 5.2.1, 6.3.1, 12.19
DBA_XSTREAM_OUTBOUND_PROGRESS view, 6.3.5, 12.20
DBA_XSTREAM_RULES view, 12.21
DBMS_STREAMS_AUTH package, 9
DBMS_XSTREAM_ADM package, 8
security, 8
demos
file-based replication, 3.3.1
ID key LCRs, 2.1.2.1
SQL generation, 2.4.4
XStream, 4.4
dependency scheduling, 2.1.1.1.2
distributed transactions
XStream Out, 2.1.5
DROP_INBOUND procedure, 5.3.3, 8
DROP_OUTBOUND procedure, 5.2.6, 8

E

eager errors, 5.3.2
ENABLE_GG_XSTREAM_FOR_STREAMS procedure, 8

G

GRANT_ADMIN_PRIVILEGE procedure, 9
GRANT_REMOTE_ADMIN_ACCESS procedure, 9

I

ID key LCRs, 2.1.2
demo, 2.1.2.1
inbound servers, 2.2.1
applied high position, 2.3.3
applied low position, 2.3.3
apply user, 2.5
changing, 5.3.1
configuring, 4.3
dropping, 5.3.3
eager errors, 5.3.2
monitoring, 6.4
OCI interface, 10.1.2
positions, 2.3.3
monitoring, 6.4.3
preparing for, 4.1.3
processed low position, 2.3.3
spill position, 2.3.3
INCLUDE_EXTRA_ATTRIBUTE procedure, 7.2.3
initialization parameters
XStream In, 4.1.3.2
XStream Out, 4.1.2.2.4, 4.1.2.2.4
instantiation system change number, 2.1.1.1.1
IS_GG_XSTREAM_FOR_STREAMS function, 8

L

last sent position
monitoring, 6.3.3
logical change records (LCRs), 1.1
commit_scn_from_position attribute, 2.3.2.1
ID key LCRs, 2.1.2
missing, 7.2.2
missing attributes, 7.2.3
scn_from_position attribute, 2.3.2.1
sequence LCRs, 2.1.3
spilling, 2.1.1.1.1

O

OCI interface
XStream, 10
OCI_ATTR_XSTREAM_ACK_INTERVAL, 10.2.2.1
OCI_ATTR_XSTREAM_IDLE_TIMEOUT, 10.2.2.2
OCILCRAttributesGet(), 11.1.5
OCILCRAttributesSet(), 11.1.5
OCILCRDDLInfoGet(), 11.1.5
OCILCRDDLInfoSet(), 11.1.5
OCILCRFree(), 11.1.5
OCILCRHeaderGet(), 11.1.5
OCILCRHeaderSet(), 11.1.5
OCILCRLobInfoGet(), 11.1.5
OCILCRLobInfoSet(), 11.1.5
OCILCRNew(), 11.1.5
OCILCRNumberFromPosition(), 11.1.5
OCILCRRowColumnInfoGet(), 11.1.5
OCILCRRowColumnInfoSet(), 11.1.5
OCILCRRowStmtGet(), 11.1.5
OCILCRRowStmtWithBindVarGet(), 11.1.5
OCILCRSCNToPosition(), 11.1.5
OCILCRWhereClauseGet(), 11.1.5
OCILCRWhereClauseWithBindVarGet(), 11.1.5
OCIXStreamInAttach(), 11.1.5
OCIXStreamInChunkSend(), 11.1.5
OCIXStreamInCommit(), 11.1.5
OCIXStreamInDetach(), 11.1.5
OCIXStreamInErrorGet(), 11.1.5
OCIXStreamInFlush(), 11.1.5
OCIXStreamInLCRCallbackSend(), 11.1.5
OCIXStreamInLCRSend(), 11.1.5
OCIXStreamInProcessedLWMGet(), 11.1.5
OCIXStreamOutAttach(), 7.2.1, 11.1.5
OCIXStreamOutChunkReceive(), 11.1.5
OCIXStreamOutDetach(), 11.1.5
OCIXStreamOutLCRCallbackReceive(), 11.1.5
OCIXStreamOutLCRReceive(), 11.1.5
OCIXStreamOutProcessedLWMSet(), 11.1.5
Oracle Streams, 1.1
Oracle Streams Performance Advisor
XStream, 6.6
Oracle Streams pool, 7.2.4
XStream In, 4.1.3.3
XStream Out, 4.1.2.2.5
outbound servers, 2.1.1
apply process features, 2.1.1.1
capture processes, 2.1.1
capture user, 5.2.4
start SCN, 5.2.5
start time, 5.2.5
configuration options, 4.1.2.1
configuring, 4.2.1
connect user, 2.5
changing, 5.2.3
dropping, 5.2.6
monitoring, 6.3
OCI interface, 10.1.1
preparing for, 4.1.2
processed low position, 2.3.2.2
monitoring, 6.3.5
rules
adding, 5.2.2.1
removing, 5.2.2.2
statistics
monitoring, 6.3.4
streaming network transmission, 2.3.2.3
transactions
monitoring, 6.3.3

P

parameter modes, 11.1.4
positions
applied high position, 2.3.3, 6.4.3
applied low position, 2.3.3, 6.4.3
processed low position, 2.3.2.2, 2.3.3, 6.3.5, 6.4.3
spill position, 2.3.3, 6.4.3
XStream, 2.3
XStream In, 2.3.3
monitoring, 6.4.3
XStream Out, 2.3.2
privileges
XStream administrator, 4.1.1, 9, 9
processed low position, 2.3.2.2
monitoring, 6.3.5
propagation, 2.1.1

R

REMOVE_SUBSET_OUTBOUND_RULES procedure, 5.2.2.2.2, 8
replication
XStream, 3.2
REVOKE_ADMIN_PRIVILEGE procedure, 9
REVOKE_REMOTE_ADMIN_ACCESS procedure, 9
rule-based transformations, 1.1, 2.1.1.1.1, 2.2, 7.2.2
rules, 1.1, 2.1.1.1.1, 2.2
XStream
monitoring, 6.5
XStream Out, 5.2.2

S

scn_from_position LCR attribute, 2.3.2.1
security
XStream, 2.5, 8
sequence LCRs, 2.1.3
SET_ENQUEUE_DESTINATION procedure, 2.1.1.1.2
SET_EXECUTE procedure, 2.1.1.1.2
SET_MESSAGE_TRACKING procedure, 7.2.2, 7.2.6
SET_TRIGGER_FIRING_PROPERTY procedure, 2.2.2
source database, 2.1.1
split and merge, 2.1.4
SQL generation
data types, 2.4.3
XStream, 2.4
character sets, 2.4.3
demo, 2.4.4
formats, 2.4.2
interfaces, 2.4.1
start SCN
changing, 5.2.5
start time
changing, 5.2.5
statistics
XStream Out, 6.3.4
substitute key columns, 2.1.1.1.2

T

tables
XStream Out support, 12.18
tags, 2.1.1.1.2
triggers
XStream In, 2.2.2
troubleshooting
XStream, 7

U

UTL_SPADV package
XStream, 6.6.4

V

V$PROPAGATION_RECEIVER view, 7.2.4
V$SESSION view, 6.2
V$STREAMS_APPLY_COORDINATOR view, 13.1
V$STREAMS_APPLY_READER view, 13.2
V$STREAMS_APPLY_SERVER view, 13.3
V$STREAMS_CAPTURE view, 7.2.2, 7.2.4
V$STREAMS_POOL_STATISTICS view, 7.2.4
V$XSTREAM_CAPTURE view, 13.4
V$XSTREAM_MESSAGE_TRACKING view, 13.5
V$XSTREAM_OUTBOUND_SERVER view, 6.3.3, 6.3.4, 6.3.6, 13.6
V$XSTREAM_TRANSACTION view, 13.7
views
XStream, 12, 13

X

XA interface, 2.1.5
XStream, 2
client applications
example, 4.4
configuring, 4
DBMS_XSTREAM_ADM package, 8
demos, 4.4
diagnosing problems, 7.1
dynamic performance views, 13
managing, 5
overview, 5.1
monitoring, 6
inbound servers, 6.4
outbound servers, 6.3
rules, 6.5
OCI interface, 10
character sets, 10.1.4
functions, 11
handler and descriptor attributes, 10.2
parameters, 11.1.4
XStream In, 10.1.2
XStream Out, 10.1.1
Oracle Streams Performance Advisor, 6.6
positions, 2.3
privileges, 9
security, 2.5, 8
session information, 6.2
SQL generation, 2.4
static data dictionary views, 12
troubleshooting, 7
client application, 7.2.1, 7.2.4
inbound servers, 7.2.5
missing LCR attributes, 7.2.3
missing LCRs, 7.2.2
use cases, 3
replication, 3.2
sharing data in files, 3.3
sharing data in memory, 3.4
UTL_SPADV package, 6.6.4
XStream In, 2.2
applied high position, 2.3.3
applied low position, 2.3.3
apply user, 5.3.1
configuring, 4.3
data types, 2.2
eager errors, 5.3.2
inbound servers, 2.2.1
initialization parameters, 4.1.3.2
managing, 5.3
monitoring, 6.4
Oracle Streams pool, 4.1.3.3
position, 6.4.3
positions, 2.3.3
preparing for, 4.1.3
processed low position, 2.3.3
spill position, 2.3.3
triggers, 2.2.2
XStream Out, 2.1
ARCHIVELOG mode, 4.1.2.2.3
capture user, 5.2.4
configuration options, 4.1.2.1
configuring, 4.2
data types, 2.1
database links, 4.1.2.2.2
distributed transactions, 2.1.5
dropping components, 5.2.6, 5.3.3
ID key LCRs, 2.1.2
initialization parameters, 4.1.2.2.4, 4.1.2.2.4
managing, 5.2
monitoring, 6.3
Oracle Streams pool, 4.1.2.2.5
outbound servers, 2.1.1
positions, 2.3.2
preparing for, 4.1.2
process, 6.3.6
processed low position, 2.3.2.2, 6.3.5
rules, 5.2.2
 sequence LCRs, 2.1.3
start SCN, 5.2.5, 5.2.5
statistics, 6.3.4
streaming network transmission, 2.3.2.3
table support, 12.18
transactions, 6.3.3
XStream administrator, 4.1.1, 9
PKxCPK"8AOEBPS/img/xstrm078.gifRGIF89a:yܐPPP```XUVppp/+,omm=9:OLM000LII}}^\]@@@0--Ď֕usstrs֞و޹vuvzyy랝㥥HEFfdeURSgee̯ۢljk~`]^DABROPIFG# jhiݳPMNԶWTU956;78˿pmnKHIrppFCD|z|{zzMJKZWWTQR ???ູ>;;򧧨USSGDE<99Èighywxxvwºoooecdʴ󨧨ӛnllۿĝb``ecc!,:y8G":,`B >a…-*bƉ 8bɏCJLII(/f̍5q(fğ@ JhЄMtiӉOFEP)ԪN^-hUV\J+ձ`ˊUKYS~=[ {{a޽vwp߂&`5&cŗ2c˛1\hϒAװc7"el=7`ߵ-|wq> me0U$#,(# 42d9x#5#A;CS$: y$O$Q2#SBWj%D:ab &P :cdnQ7r2D'zg#uYh~" (A™((|*zh]-馜v駠JЂ≦ꪬ_.*무:+kꫨkKT6묱"Vk1v;ކ+nڎkn[{+K:D-Q$؀7p HA W,`!0Q+AH@l~`@T~B~,tt1D~L4"$~pQƨAO! h\ ?[s0p0!-#|@,?@M01! ` 7AAsyl?q@.]@Xm9M!H8-cNgnc:A0盯*,P~G'H 2?zlvP#~=Љ26HHҀ6U@ 2]j6uLZF9 t/1 a9K M`{@P|HSMȮ &Fe }',HF'(Lbc3 @4`H["1!l~sۡ*e]m-o'|ΆMgfF ?ּƠNev#d"0WT=%Xp"lƐ=ecHB 6;(sfbrHYW% 0du]R[l a8!XÙ҂I@:dmMo r&ofhĶ3B|BW@oE+"Ä3g0CϓXĴ֮"8i2ti B<_ #QE@v i"Fzޓ8JX]TSVAQ>[!l2x.|HD(!瀣YqPj)@. iCH4`)2Z]qXBMlpK&ڲ4OaZժtެ?lpV`VUMњVP"KHf*1E vEaXjG1@;R(ﳽ&)3-cM7g:to#Ԡ+Q1ƌiDgZFKEzD5 f([(&oD]0"&ӯO++E6a (v_33D8T:U0VbL8qz@L2e%ǘR)X²-XՐW1_YIF`~[,gǹf3?=5zЈNEǎ> @JS:vVBaiK j2Y| VVh@ aޙ(Z ׬aF53zJaR |[bȅhns[ن,& _D&{a'0BTVl/@x  ~17 rz ڢR@X<K /@ #[( j M H e; m2/J͓rB7iq!,xC&(*0-de0֌d-g˦C s;9= xCяNw@L dr]lÆ| {?lw(V4rg."8 | G+xgf(1Df= <_}[)Z rϼC<,/JЋ<)P!6ݶM Xyzw/yPL' Xr70= Jf~{ET3m4P~ f97N$OsX73sUYvk[p 0$ys:I3QOҳ6<^~036xBE_b|[ sW$H )wE8b<7w4106gz/=zsm6/eX4A  JX,ty=w9U6tU [M}@X~sȀ7!xysX[qEу8s#6t#@h1~g503 SCZmHG)Cy0xZ'}c< 0;@MȌ\dž)Z H'8@B0QOtQCT @ ӅD$:珁@UR [ WqӌQ8 ;WC#*(YK@8`4ԇ8V9 0P5JA`cDS<㑁<;6GB [%9ZL&jH?a)3D>'sCj7~\ @ZpT)M9o` 1]j6@T`9$N{i6%a346lu[oO9&1P0iE9L6TxzcE1#m%[p4L Rzƒ0^t23T0lșʹjH+˜G [# LsE1y`p'`qx˜ٞ9[N:x˜[y,@nɝeGjt8V0nj˜z,BUc4x˜& ޸ d D 0$r [p ^(o))jI+b7xB 7[@^Z`o.W3m?uutWJ ް ;Uـ7[Prz5oOu=ݥve50T1^0 : !T p[ 7C54aa0 6@;)p{Z_~Waqlp*Zٜ>;>By1˃8zCd^-#HsOjc{-ԅF `gyoyGGJ*jj e3'vV$Dگw0xwywɀ {H`_&#`ZDAA D`+[`ت_(-nYHJL۴9y>a6DFiN;iC98PCu @ om |%t* p†4RhHL531-; Z% qy ptXpjda`u[в@j 6:A! k&?{l`Q{D:ꨑY4[3Xzd 'i[mٖmoٖjY5k =A#INur +Pbjٛޫًr p髹c` dS` D )+C?6gTcNs37H95ü[k P 0 @ wəY-P @ {0Ũ5 8P+>{ނCL E<w䦜uPW|[0(0S ԩj?2Pkl ЦLC)yBQ³+eBd˶(7{Y@s52iHW30E1@,olĢ t" ; DpJV ;ڐ lx40>džLE,\לۼLΑ΁v{pP67a; =o-D0·/턋@! LAaˍО=)z-AL))l@sX:D…2dC=#Õ30άBLL֌8=| |_d 3j|)}9d@腾ِ ْ>߄,*Y O']P13~oI*kMG M@D^@1̺^j2=ɧVDP LF- MrfzP7-3ҍ@ PM~-j-av.>[nN~ Н+ح)7@] kY~Pp~@MM`Lݽ[z@kD8N.Vɮ*vܯD[O]M]ɠmD έ}- [Nj@_ @1ղ{,vk魥ѐӰ@=S0SYP` |`.v#%԰@z L\ OE@bzw Q밝Mթ,J.Dʮ{{- : @9ɥ0IN]?v \ -z}(`lС&8Aϟ(C6BA b9K1eΤYӦ-9un!>[LĉN,)$f Qmɖg "ْ KNifɚ%jӦL \)Rf-7ۗ/Z4[OJD"U֖xPmY -vL2LN"?ԩŧi׶}bՖΖ9?0@o'6䆊/gLe0HD2CA{;&J5Jh S_"Jl1D"!>j"@H![D@)npB +20;*" 'XaL ` Ds(p!5r .0G J䱝*0b(>a,xnp\mG׆4HJ(M8:.8t(:z#>h0OP h&N!I&/!o kF2o IQMjT! LZkɄd,D-e[XB`Ô`J /SzZl2]B _BY03_0/BiY5m<7;xN6Nrd2(&6-~0MDJt1Q~q(т-R-, VR64[]^2e*}ŝ-y+5ȗL~׾8(h`%z+o=l }t`Ytxgn=t}uA ;gŜ ͋OI&\st:tQq-aOآfzëL2w}֩n^Z"7\ 4"#g@ Ԛt@ Ӷ86'? sfމssXM"@hN8&%Zܞ5PEI!htFDN@PG4νP$O~sne$`;E"4)ˆ-tR_O~]'At*b,iH?7'NqD#Y,I2N;ohQbOkBp@   PD\PP M3NDCpJPB4exS,iiKa!,߾0BA"\LfMO)2tFwӂlR\.G*t`q>'LL(qж|2\XfTJyJ!YKhrJ<`qthQp9QeҢF;YK^sT4cj 9[a)R@ʀ z^̜JARUc%kYzVUk k!]U\Jk^(eRҼGmӞI._8:Łi,KSfbthNKn:1+؇FԨld$hU#a] Jdõ#5 @88& [W%nq{\&W}a$tƠd]Yk4I4\@:ׄ죜cYl յ)vuBp 0s)" &7wX6&Rʉ sKA Op-|a gXxK,*[{n'a ` 27Z8NU2ix@ C$)9YɡU(=\yc̜sXc&s͌3)+*B,P<[@aiFd A0b?0@-EԲBAMh.P2Ԫ-O. m}k\YEfb)>C.Y݅@=gu2tMQE&5 Skt GZmOY"w}o|[wo{ڢe^o[E;Df,dB^])KtD}oStmXۨ v8DJy-랶Mop\;kIQ[E+-؁ɮYLhx@maҳ@K'l?!L¦#N8*{r܂7RY`EARu9M`Vv`  - vss3(A B2v%q?_+ f]p {Ȋ JCq U`4Nz-^7^o plAa>霌=paQr4~ 4ׄ ≠*dm{ ā $&A$ԕbCaX >>3Wv[G@?,&wZT P6{ kS "R7pöʫw~Z Zȼg؂!"2"%\B&lB'|B(\B"By+.X " 2]8h672aȞH:J!!h"ű57\ &7/u,}Ю`In8'bDH,1 B. , \HCp`BFa`$b{0M;!̎Đ3DdlCLjLExt`?{M4prvP]Oܹ (wN MkOOMPݵMPm P M3kP *(P =?Q = -Qm(̉:ѤOC p(@CPB8 h@R@h*OR)  $"MRDp@  hR4m @(hp 2R+S?S<* 'xD 2) ?PMDP0=4U4up S:ETgSYȈ@RnшP@9T$U5P]i@SUVi=8YVܼCiRhjMcM dM epMeVS(URk=:MV%VVL A v ZׇuW,- QB3 V%T=DM8D(!ë́Yp%P&P΋K~e:ED(3DRQTQB(?HO]YUuvDi>LZx[uQVI:۴نeR+a,x0员w"[\e=BӾ%EX ],\Q!M3K-} %n}n5W@$SD\]EP0)]WuR]V%y^N"ޣԔMVmm]Dj N^UMVlT9֝`]p>RARPr=q PםWXWD8B5V.bK0ai1qTR h,M MC65 ] V  -ڂ6x A= ŀ8RDh/Q ([,c3P$VG`s5E `=ʈPiN`Ɗ| ɉTHZ. [Dm]X~md e$ Z,R(WPYP-e[ЂF\e #V5?偁Z  rVWJgY [\meog e]~nPnh B {g5]Bn 膎hIh觷^i։ii&his| 8#bNNX-\靎F4j (_e䡎ƞ֤FXT&lnj>ꩋjvjFj/j}N*k>k&+|8Hkkn+k.ȃk,hî&Nl.ɻ>lɦ7l^ \(6if> IFx4m.^mn{B6+ꥆk mx-SlI`$=n놫m6mT^l= ܸUO9&8no#E6o eno0"!tQL' ;KO'-czBYuZuY'L/UgBnscTO {\&s{{{z'=wI|?_|po|uf Lzzzѿ|ܢПyd՗{7Q_x'?Om~=~Kg~~0~Ax("GKgwK~POP8r$ „ 2l!Ĉ'Rh"ƌ7r쨰 H"G$ʔ>laRGtTҬi&Μ:w~ gG@"d ̎22mEnY*VB~ ї1j,ڔVN\ք= /`nJg&ȗoYŒ'<2嚉3Odw=8."7f9ֲgWDMDָW {Cnܡnܯ?9to/ѷsNx:Ǔ=ry'H`m'~6IYUxT_ ZxZ}ehnsExTc=v%ee 7`kJ4b&Hzǹci7#n_,#DdmC2!OZqWiSbٜayuٍ&PhܙmIyIZ7'Hޝ}j֟٠ z fwz!j( R֧uH ~VdjZF(e"#zz$aBdԣhA)UY2%ϲ9Eشf6m?{n6-TA{{隸:xlp )Cq? |)"+]J`cպscp~s*qpCen^#N|~/G75usq:odz>aEF4QtZbgYG5Zk4q}~0Ѳm.mڭU1Z6rSxݥ͝nX;5^X%n?劖{9衋>:饛~z)~L֕3x.K!~;;[ ?|!/8"Cs>c>{OO?;?wS A< ZO | #xJpqas@UPX[RID G·M2&  'E5bxZ008ЍХC𰇘 a~h!X3"ZHC&&~P"*ŊZH.ŋbMZ_8ɫۀX -@"5ŀ~i`+Db)H,V =@JNItay l6@"&@ <9ʔsx:qل˄88 ?}1ֽ(pDVi 5!P/ Dfm10 wтn4Vv4tz,Yb`ʋ0Z'V7~{bؽwe]]]҄kæFl.Ĺ}}ʁBͲy_hkߦǴD9@tsMn򈺶!l;?㞷lԛXHptX Yǖ7܁_ֵr["7#.r{&7KOr|.'J_.|6IIH>9Ѓ.F?:ғ3N:ԣ.;=s^:.f?;ӮnÊӽv;[;X ?<3<#/^q|ny`~OK?/~wJOz~I_/{~Io~H/gH$o kユsFRt +͏~^_?1۟)B !`_:``ƟIR``Bh`Qz``ZE ZO-Ap ` ``` `XH "*>B!F ^ 2b!N!ja:!aGHTGaA$!B?aa@1ab!r"b#">"DZDA ]"dњlpX'(( "+,|x".G id^/b_0#X(}@A@1vi]Y)Cx4@)DgBalt3>Y֐5iڪD `:X}::gyU#=#8֣!#B;89cC lYbcYm? Zy#?bDZ5Eb}"qV"HZFMBFCc&MXzmzքUxbm#cYqG Dr@nіQX͗6fA%X2GObALX[%{iWr0>'Hq&L?X$nce^!,=I YB}Vhc~bmX>YyVn&!~.eXn.Yt-e*D#4 "뺮Yn*",mA il.G&K?dh@HzE6@PCv.>cD"Ad"/d@/oX^S(Q.-mk}/xEoJ0oS0۪*DnA6@Ad// s *j0@W|fo .Spp0JJ$H?4$0ˀP@,{1 0B+$B,J6?qg qq,Bd.$D60A,V/% % +P1n8gz21rtr)S(ӌ*++S00P.+^L@2r/>n01///+KG,SE*D425D642E|3I܌39K9*6E0sʨ<[:F<糌Y?=2>7E5F4%4S,4CcCCDD0, tg>i0 83KjG'27btiTt^D`´4NKOkN4=stQL.u:SNsF?cAO5QTuf\55VO1TQDFCp5ex5TmmttSr3{MItT׵,5HdSts`5gdvX G0b8VCvGHaPT'u\5]?1ZSg?Tvz`w5Odijj[vB6`h6F5m_h[tin"\ӆ\4h4`oes^(5KPWnoo6M;bgmnr^u[ulsx7xwuy3gwzzvg_2<Ƿ|Fw}k߷=_S}wM|[|7P( 7~G_urygDs[qtMO8B xS rowwa#x+o8Exc)E08[8Dswy88/O6D9yf'9I@8m 9Z8OHykSYXl'JR\w;3st'׳{sSkOCqWĞwKFgŠ7A3CR7:S8)7#cEDSEĩ/9ryy+/yb:':P9a D9E 93D8;"czkx[z_[w;4w:lN,v9x;s{˻oSmCGIDP{ |G'}zGW~x ;+D)NL{ϠiI "$  c+PC,H&8A ǁ8j]|Ʀ8  @&,"d'@\ƁBHGx+ܒ.ɎpQN:с0|8HaėJ∐(ɧ9 =QŒ*@ ?$`j`G3/PEU :R L2(*UѢ\uTQUN\w|#V>|8Ef֡?ݢg:n[8pխ ujWܝޤڭW RPm~~[8 >$H߈]#` B %$'E١!.6YU^9єY~YPmuޙke袍>餕^馝.㑍k묵l -Jy> U9%)垛cl$嶏X@=Ft<@W6HTk!oOrzķ\?dJFHS|6l?=j(v6Y8eWqw+,Vd v}yt=ddObuOw<;ĔzRB8P %I" դ γ={joL? P <(6&hqTA( $-я<DM!p@XR*"!`"Q B Celj“(hn|fL2eD%V`@h٨P:V|( ȝ"Fb$8 lx Y)殁"`G$bGiyD*Sp[T)@e3HATѣ:IO^'yR""+ 23膌)ZxGLP{N' $H .U&/_N'ʥtvs 6ӆ H ؔ|0@ɁIF=%|TLF͡hEcNs7`h"D'(VZG</ƄQA{>%Pҋ/|觃!?H 2s.%YiIJχaÁmdUHP `m3N0bA + N,,@m(&,(0qTV !d,jkz ȚύԍYɔ1n< z^y!!n (hAv*!m_k.DHLxth!MNO@Q F1b>(1\3 Ő ͐*$m@6B! $Q=T2.MJg`f, ' `2H0k P kkXP .mp+2=Zn KK'73M˪!ʨde):,s7r1@HO б5c5a9d6hS1lS8 O ΍.a7q.R;f6S]~C6313863\N6,P5#g2 ;i;>]=e?Sr>?%@ys@@#AeAA}S:s6&tX*.Cc3B/>g-7 DC7GTJT68;;FCDGDE<99geeȸ~oooighxvw򡠠mklXUU§rpqb_`ĝӐ벱ebc֙cab!,E, ؤ) ,0B =lpĊ bpňv9RF'MDiLD5]&P@-_YgΙDJѣH*]ʴӧPJJU!-ԚJRdkٌ_͎q+ڳmbS ΂uݥo_@{y3ÈGrqB;>9aɍ#^Ƭs͓;sYthңvl5ӪKv{r[qν;7ܬɮU[ÃwoF\XpuvzH ?~'<0}~{O`~-Ma x& 6%BBGa؄8~az+x4h8HdUff> ZfYlBv$mI$ O2%W:%4:)di&MCp)hinީ|X~`jTy(.a>*UH)^U P AƨdnMXwUYܙy Ffц +tEJ*aF%Y5Tm(Ϯra.*.l@@!nB1*Y a*YnKoln)P@ƧV[CX@ S,Q@C\r:%-Rn+(@2 [t:8gF?#-+ DEFaZ ꮼs:L7Q/,UaֿulY{=?tFt 漦p^+@ 0^@ #_`ƲZCd kka!YFnhv=t ˁȲz/ O_@rJ8+l{sw[Xp0j076u@iB6hvodCպV=g۠x{Eo\+UX'c]r ؼ%9yM^S]UN0q q7E8- ئZ#e]c[Cx6AuP@ ,X5{!Mq@|ujSq+s_vźڍkt.>ZRzDh% [k[B\S^G +$PEꔳ$C-f/x Tla"NMe?.93vr|+0:PqUF0(ƒI >݅swKsOc+=s((a}<%)} Mj8ka+ꆄ~orV GCqvOP06 nX6RjqcXK S8h\pZS9ӤPNreVJ tst"eƆU~z/ ?ܵH`;WR<} !T**uLB`5:VM?]f葁oI^@ѡiń Γ =lq`LksW^@~ZH=IpPt[0fg=fZVرzufU Ρ`[7/ךؠ>aʷb ,$ML=(g4xcq,S\`j rࢬ罙fVWS%5j9bLt(mfW_0~@kn0og& :9t|Kl0/Tnkڐ[ ZwBNv,d1)[TNur3:}t˝U0r !MiA$q`mZ^@Ml8ZJ`rǕ1mZu@f}b((i?z95e}^^$β׵um].8KǶ {æ+z \y}]#M5qs[-7{ӸϽ s ueFWw*L¢*"XAx{]ȽTa]M"wsI\6@jQ :ts AըjC@C x`; na$q4p]7 .wC ''&GQ̃kէR^Aa*u@x+0[x  g֜"L7<ֻ@uPT|7QY)=4=Vٮ%%a_Os< PЯjOWHG?78@W`﹏8Ѭ-\FfyY̟$8rC+D@a\o4٥K,DZj upܐ~~, @ue097,,X} ^~ v(-hu@-`c@pDZu60cG!U[P^Ȣi=C?&!Џ 8`G)!׌H8 u5"uq4d{p 6VS3Xc1 X@p .7()!g8Q8 F@Ar1֔ьh7ހXUؒh0)l 1EьD0i(`IUhH{R <|y(ɂ07 )iU+ؙmؕ@ $#MI1rx3Ҍ$07@HJQ}0zyTЕ# yzI6=#d,8h39\| Z IKQ ]r|80Yzi X€EemDrAb/#Ua#Пp /(!-e@)'x8,P(:UQHё3&,&kHTKXI֡@ ^W~ZYϷͰ(,*ic/:{ɉ #J WcौZp@ D.GKzGȡ80J{ 9Dp @}P pa%ШVxj~~ PyG^uQƐJ  } v5skjxaRꨎp3@R0^'w yZy`g bz!wت [@'v0w v ŠjNJ ,j4*ノJ:>襎h_vVq PG+}b|: P_@ ` 0 *ꖱ梪ʪju 0 `&`%Vǐ/ `iKſśC'kijд0P:Ml kLA(-zq,@M 8`/@^ 0PM<ݐ@s<\|؜ڬs@ <\匕b "8<8Pɣ P`8 0̸`̪Fb\ǯp m(J0E`9M  `Q@ $]&}(*,.02=4]6}1αv W 5: (̋<< {9;> @ER8 1 npr=t]v}'lܑ> jWOVcδC ,.넾߆<9\M` 땢R N >PLL̴˞Ap1Y `Cȏ 8L >Ph`* @` >Ȩ~( N; 86t"?$_&(*,.0@T 18:/S~Y{ H *ÌenpʎN p4^N]fh# X..X˅:`"Q٬fJBO08 9గ;bj?_b?q/8ǀԗ|Ǝg0i)L1 >pQ:PG?_ȟʿ?|8TDϸ 8|\P_誏oV"` { L$XA .dC8 ‰`)"#H'JpH`D8؉e1 @PUҥI4JbE,ZvS4i2É6vrdɓP$Xp䎬|J(Rp'_&\aPpbpTH&Q$Ä ؄" pthѣIP6TMBP+f(z҄Q}(b'=t;׵,"wŏ'_&>aq }8Z9(US2aJTIa¹'8e.ؐZC̓ P겯4?ApA\5Z | sqG{< =b=$w6/ۯJ=,L !! 8%5+%IS^AvKQ)TbMh p $dX]olPLR(g=Uuסz bJO qМ4n|.Z(LYwumBم.p3x!2Ka( S$ACU &cVpպQ4U}!`[zD_}-ZʳL"A6`R ak ( ZbcP,1I4"+&[_\P:jfGꨬ:é>)H v4E.ơp2`&- F W<*@. 3h# 8`6`va#3 7&~Íz,`9 hy~B^֠ @h(CB` :Bp^O hc ,D2<+p\C@$)Z0 bDbdk;,"-H6D  @P)5\,}lX P(n %0]A}t@01)&e,cf$"eؑ:=IőSJ5pe-9#rK5ӈ+A!3k ?`PAk#4s1ҏ]!GR¼3JX L<84KkLPR /F,351pJ * DBⱥ`e`@W6Pd온5@ U 5p%\)9 A2M910_Qy >EcI鎼4!(rwGul<L"6 5p ;!OURs0<劖1Z[WJۨ e#(tL%LEE+f *HKߋ +]rO`c?ya x?6!Db v$`.THŊgF~_i [{Xsڐ>,!|(  J`X4FHp To>>M߂C䐼`a늱YS.xs5DdtKe>ړ ܵAl61D2$4 Z'/Gr(6ґeaBx +`gTfh h *ݰ9| yuf+r{P^3NdD &5)M}C:o ]a1o{lͬ#!RigZV3CW P=bǝb,TH!r)C9 xu^CV]bQ3hfY[{ _ety Cb-H;74l@Zwyw&/rb t9tuno ILc6.h oC0X Q] X=b.PcssE<A{WvrIo%{r-E".~k#F =勈o]f^fL}T%Xuқ,YFHv LR }>/-\ ` 8Ozb{ 29곷??+19P-Z)*$z6i,( ;? #~C񚇑:l*Y6r"3==?)8n;28A|2BjI', ,!"04&lB|  TA ۘY ;*K/%d6tC8+=;L°/Ъ9XÂ(Ă১c@(CPCC #*6Z324 M;5`xA:% P>P`S0 @$ O$<}93GTIDSJTpBMOPEIy)SLUL Q1JH\ԽT)]UUc< *Vt@x`_%'m & .zm`1@10Zx>#>` ? ⃘&%P`߂aaxՁx@ 0b1@'~`1@@@0@/~M\.c34 ڃa0b@?6&d@"<@.FZHF\a߽ddpcX&0<PPc@HeAVei>xP^a e؄aI%]dCS.0X 漕ghadQ?_6OgQVbÁY瞖&FOeHa>@8a+^-@i"fpFNlm)9obr9a&fX^" `b?p/=6lPc{ƃc c0o@q-Io.jXnhi!N#a>()l~m^}TG/r s?PN !@-s;OgbFp-W787 pfH<悈kEoA/ '6ePSi<<.,@R2q5tsx焀t]_Zg[_WgPcRog =nvWi>@-vk_unuhqzE`vw8f"mg@ ,}'"^:uu}@V>HxڎuBubO]Yw#8aW}7ǁZ_ym'w\CD/.jSy\7t?tvd6rcpMVfgUq=}@F } ž'%yT[/N>DePa&$fbg(Fr*?&vfa6{JO{xϕyQ{w'H[PmiGcEO6bbyzۏc`xwmh}C}h{ 1@B}@fW,o<8cKr!VuzEhB )NeQ7G|RdY1OA ᝅ'Rh)M#Ȑ"Gf㔒*%H08JT L !  &S*|@ A `h , LIڨ!@5Pţ2^cȒ'+<$%-3ÔI!8Nkдi .V1SA̟ڦ];!ZēF6ժx"qçO XnЫs$U]qG/scά9?g>q|y! XG! /BaN5GBxksQ*%)"-"1M&d!i `$^fjAH"I" MAQJ9%UNGEX%zQSJ#C.U 5ez(dqy'&}Y)'N'F8nDOf*nd::QE)z):8(a ***2(+hZF _8}@ )V8]@$(8k䑴#FZ!+#.+df 쟼oRNy,jDVPB϶Xr(J,J-xO bVKnUpH!-21,so (r=3>bA}47[tEm|HɹԇZM`\b0a{B'7}i 4i69 bptEJ`(bl]y= gFjHE*m7{nN~PNܶҽ9exS.|(Ƶ)[~Ox1qc䠫fGH ^~~|c;;:ڀLZ VXWTYiη^?6ޚH;f[~aHU]Qw fF6'yZ>B6L1o&1Ns:+[wȩM5I[?eoEw(/q3͆7ҏDdA"B:>e0[akCbAAYNx A#7JDH }G p"o( =*L*bAS(Q!+M,q@ @0ʙ(7@8}J-B1`,-X - K9JL h<D0@`4v\qM\HZN6x9u[IvC4T r%?8OvcJsɜD̉j1&B5 k0G(AP7 -5 aeRDH.q&zp0g((y-qP /bM-PW6T*f] 4щdA@! X]3  ؓrp5D,FM©DtZ#Jv8UN <\V敪lA)PViRCKΫRŬf;"IB̐ Yzծx]+LJ6 AdJ6JM.x+񒷼B$K. 'NS2caEAW1s`g&eόnk4ρ.mY!fcrT݆ɷ1`k.Į ܌ n06 06\)D)XD\*ġF>2%3yp\7SͅTi %W`v [fJA!JAׇZWKR,,O`,Cb<8lU?PD? l"M8nM$:`4ӇNy!|w#UkuN,@G ؕ8qU6T>HA-n`.R)>_Ɏ榠`dt*6qhtűr_c m`?9 l鋄{/T؉$qw!q[L S+d&lbaN$煄u9s> !Bo{pht\I'' n+&ALJ}$8ԡ,ZESid[yX7^"OHI@@F n+߸|}O?/*+ӿT}헤%Bыو-@Z@ ˎciɌH_ˋ|B4^,I)%ŐT_^ouD8DE b ~ 1N!Ja,Y?ۼD@ FS-Gl\PUܯ~J@mGМY顮!EbB⇔AJ&6$$%' ".]ӴI pb0y",$"D%͈@h@b #)RD!TY9AcLH3q5'@6.7~D)z8#eTţ<#=֣=#>>+*^:z:۹#Fhx-$C6A@)$F dAJx#܈AD EEa;$B&HH"JIzI za8Ҽd$ͤRMv$N|$!!Љ#PPZ#NNތl$ QHB+RΠ2ģ RȜvƍeʸBH+q)2~+Ĭkk+v*++4從UJݿ+lB.]!G*l0}jj(n·n,j&bŚHȲȒ,t,^ʮG˺,*RNͪ,ЂMϚ-Rk^Y&.H:b҉NDQѲGn-ȫ.v}z2ɂڪ-ǽ -Z[Nlz-Ԥn5.&2J".6>n{PZBDV?4n.n"nvNkn&n쪁mH.^Ȉ,ʦ=#nooff2/CNoJ.D*DRbojrozoV㳎-+o}ү>6A/Xo~/3:0BJ0R/Ȅ/AěLm B0 0 0 0 K 0 0.cp0 q#1q7-+Ӧg1zZ-lBm3&ޮ1IDZ3O1CHwp o 2"RlXu.'$IKN&oVd&B-(#(2+oUr2++),,2Ўq-r'0|32273JԲ23W3L(3R5o3I`3*37sN,r/í6,K3s:Ϧs<Fr>2;׳?0<t+W2\rd2B*/74CO7^4G{DFS1EwtG4oHtB3g*04J2IrHt@DL2>t4ڳ4O<I*@5'QcP+5j8T,U/UVg_F:2XkLrN345[#[Sǵ85A׵]s3^4\,XO^Anv5~D5b'mQ;{qR?25?taegb,csWw5e6iX[+aOXtjSj_W_6"6W׶m 2n/n66h6p۱p[rhw 6kf[qe+V4ctg#7qutgnB'7e`7x{,u'uywx:Kķ|7}׷}7~7(d{j*s/l[ҫD`( #38o4LL8J[xpcKtp8ɇqJ<8Ǹ8øԸ8ϸ/ ;}<K5sY-9#G9N9EU,Oo9v3}93OX܂ x9y<9{Թߵ9_9[9ȑyC+7:BPz pcpsBwzo?0cK:0 0o/K 㺯:߯'w:z;OH#;+{w;70𢶳/NkJnbk*»A{{?{{ne4n!?:?G9W|_f \-?86\W^FXHZ`=ҏs؊ 4 1 ]\ݘ~oI~#rIIA}Jos+Du%\<](^[F-]3DBB9t.g&:l 0#g d:':,{cfC#I4yeJ+YtfL3iִygN;y&84Cf jTSVzkVT5T6fYmZkٶuԮEo^{\ 6|qbCTd9zlb͛9w9(d̘4cE\nStlٳi+$oDx?lyr˙]R7' 0G8t4|IFY4f ET||%?ҼA%7P <uϠ)nָ@, T=J#I7DbCC+eG z^/8`G8$,Dr *j,ܒ3,0R2<*2\6qR8$85̓>@EA =4B]mHURJ-U3,S4ݴӑ>4MՠQ9-n@UO-TZITXe5W[WŵV`7XRWa5YfuVhMVqxYVZn}hÝ6f\Svtŕ]rv[|絷{n( Fw(‘P,(2!>>飆ђݽJ)a"G7K)"ex瓂6bϯ-IiJ: x#SjȂpc2tC6̀m7p ˜/hCcNlbzpYc8+ol7/q,Άۀ %La \y|ǿt݀k2T"o6,6hGjfVjPD}onp3&C6޸)zz 7y 3~, G;ןS[.3 m|$)B hأh #ZӚ>9@;4e=Cd(pgo_2L8%'{/QcD ԧ>%rgP R~F5^hY|aS?ԙ||HY=gz󏲐zv7h_<\2$p%iv)0h@:1fAo`TDq(.ٞIby"+8"䨅\_i 86cӦc G64S4onhԏ'Ahh$4G>L^syg9G pL'X4Mc!}iDL2Q@܃N9vgNџS|IES2c2ӆ`0kFC=}KЧıN7Q F>a`Ɍ(;gJb޼JψtFhR)*qr6|HZO p$6L93ړYضCpE'R: a(ZJ,FSΖr0 #+ nDĂgc%C ?f|דs)iw}6y8+!3FcC'l }=gȗ6.r{03ç}DR._0GrH e SV;ݥ$ЇkVnlȐ| $S즱wygwMr7(~Z(Q$a^tW|y$b )zkR5a4lPAGijqy8g>Sx83NpsZZ6,haJmLf|P@v:iW<42{NiFt>sҖ~2,76I^m)/;m\ϚHl9'݊ =76V>iuBӡuw-PN>_Y9W!.CtAy+IB6-Zfib,g$ NP9"8^0u3nB#|{ejL6C޳|( m7baA#\xv;I19o)a ՛ 2 eZr^w w8f禹VĔ\8.S^:(ra&#V D)j4٪e"2#S-)r@ITGF$7bGF\%OLXnF [OVl)AW/)g:3gq8G }f"ӎ?%4G'ѯ @#PF*J# @/fh^ bO#c.ohO.FiJ oJ<0+$ D QN8l.Kn#vY/}XT4pBzih;p˫KƮNf2$Pqp*tq2&G/ 3ԋbv'8!F2&B1qn̈=`zI)N,f!ZNMb~Ll>BL-n@`kG*찥Ш@)N$JZ&Jxqzq/& cΒQ*"CPj P*E(f@)'BQ+JG$,BHhΌ Bd bl܀k~o lO )mόePو)PQFZh ⩁(t.e&JԧR%~! " #cĺ|N) eЏ$ƨr r$k%7#O!# &cǾ̇ynoz r\q)訧v ygqoj&gCMOp+uBqA>$.("pdN~8+ePpKB( u(ӑȐ%0 3vPn0u1J"Q(r>D$p0LiTҐƋi2@FH}g.8KC~'JLj`?ƲJ\j|-ejMGM8Ч;Gاx5//R3 0ToiT6Yi7W*e}lS@MЦ)xw31PS&(*S1  51@OS,hTk8-nTqPTCR$$ \PـBDC%Rvc1L:v>8QP{xtF:4K7BLI#"2cHGɠh Z蒄 *u:)8CX"JR LhkpxTrd͸SO mΑ-IQ#UU9chTlh)*p@xd|6GxQ$U"UWUXU耱OI=o!h%uXu0FFb)VU6& =O2@Q[ߕ>?hH}rVX,>izgn zmh%0H^oB~ E| pRSM$bEi3ѦJ5S:a]@IiOJ 2 )w$jCXDϬF$$ v @a( g$dEXS/N`(iݵ>h%iB ivjR6cckQ/l6AlilږncRgVmoDVp$o!@qd qϤ CqwlC(rdQs77Nޖ%j!hKtOuSWuWu[u/>tDtW@A rWwww{wxWxx/dwvפvUҠ9Ġ1yL7%yw/ؖzHu{zr6'w9 } |7&W9 ~~%$ >~ W%w$jX3~KBp`@ 8X9X GxMAB x/`$t {y`i'@{x(Xw†oxJ:'.X p$X;{!@ `؋ 8/XzyM⊳yǸq@ @kxXژO$rxOX XӠ"' O$.87|Njy˘X W-fX=yF@ق$i!'gxi!vلBwԗC{WM7TXbل@c8xyXͷ99ٞk{6ZWYڡ#Z'y$ AW;ڣ?CU$0.z9$+[ڥ_z L-P:og¦o>$vZ6z-~CGcè:> 4z-ZÃw9.`tuiyuZ:j3暮E֮#Zp3گU ﺯ{QZ :yJr&{3{+ڲm5[38[+I.ƞi^F-?Bk>6-&^GBi^m~kֿ~y#_'+/8+_:oEZGKq'c_gg_k_wa}Y*$z{q >…?-$c??_yƟӿ-`(@`#Q <0… :|1ĉ+Z1ƍ;zr 8ʄ<`!5j | 3̙4kڼȒ9{:<ӤD=4iF?SQpIE 5֭\5 :AbmZZ6ڵl{~m-YfmSųz x۸k4CF8y?8l5l@n kꚑ柙}=ZI)g O] 7s؇@9صo}bΡz .`HaVP|W@f\(ZvП@UhF9b*jT'P~*݌]d879dJ.In_d pFyae]a%'exn gzN absa#fktFc {^FkpZER^DsRade j41emԩcj ֦+jZkZH뭾PemڨAlaF)`睒+N+bm*?d\ǥWƛoԞ{]a@ mHeGoiqvm:#q / oZ1qƿ:,oi_Ynq* *JA#:DLGu3GmtmQN?mvٕWi1yCOgW϶VP OSD }Mv܎ծ)-w}ѭ(wj.x\$y$d)yY?(ez m~CN誯 PϮ(B{cA|E9ɴ9@hSdv[ed!x:R[2CdIXEWCCB  YfCx33oSL$CҀ? 9Kpa` ч>,H7iKx!}.@L#"iMc9%B&LBAl@ *|& bN(THch?JTc#A\Ё ӡihMgZdA6wMg.S GM~.#KE҂2MfLSF> l ę'mEI=BІ^$VՎUGO2jE$G\MmAāNIWƎ,6)Bm|eiҥ5ZEփh-lWSRŨk7r$)mCv!&;cNԳ,sJw5̥;MJ[#|opZ^֟ ϫp4,oyS' T`{s93i"@z Hhhq@E j`V<;Vw0Fȁz@q#H%RHJh+ "Ȃ1H뇂2Ȃ.8ȃH5HPCHEhGGH$aIOFH@n Gc 2~YϷ.&]b~"LBe([ kȆsגK"snp ‡/ᇁXBhy,AjPXHX8HREZ0؉X؊X~"S8QHxh8pЈxҸ؍8x9 A(، XhH88ȌȌhM!IyY9HI)%(IaM10ɒ)Dy9Yt;ɓ&?)pA)UxE {D˦KYkM锠6'!B 2o2QmG!rA5'!4t"RZ3$2TQ2q[rSr#&d0J)2! d`TSHS>opY")rPo4@Iw\fY2a*2W2iÚy X )m@ fٜyAA|t5kٚiAY(q"_Y@恕n)n99uPIdnZ٠$[4nf-a9jǕ5.rR 1fR$&0cV"Vr]c#FSĢ1(,A*1s ?4o 9㤘4&S,Q[jH.Ωd@2))hʥ\,1t0q124j|Ġu* &JXP>أe@J\9" $C3ZZ9ĵӪJZ 9;;]ă*'p5ٳ5# `׊٪ʭ :c:gz::3 *JjQ<278į;22k*01} $  J")A$;~~+*{K(b!) + - !35;tԢ"dz=+-? sA+7GBIzK˴gQ[+D7k[;] qU %;Ge2gP*m v ! Wu{Bl{p~[A Yp;*҆Y;;5+k+p"mY5 YP P5&ۻจˋ۹{+ כY ~]'&˷{# {kǻ˸[Y M P |51r;;RDѻ "Q pCl YqY [ULLN,TY`Ũm,IK\ SK\M ƦX y |+vkk05[k o{|DžSg0v ˺5R~+PŹP [ k   _a[g }+\ ˸-lū r{ Ƀ!;>\ bGX ۜ\|cEvTp 0oܽ|+V Ƚ  vЧ˸̀ ŋV̸X VL"9 +LG`{¶ 5pk6,XG GG 7,՘K 5P|kö[,BMl}lIn]׆gtEA>!؁?hÁg׋- !!ÕAٚ͵~ls~H=~q^lڧ]לM٬٠l P5ڵ+=mC]kqQ  ǍTIM`m݁]^ύGmS=PQ }@IQJ v .>>X%߁q= ΂}e .] nP;PKK MjHjPK"8AOEBPS/img/xstrm073.gifP?GIF89a岲@@@???rrrࠠ```000 999ppp///PPP___oooOOOggg;;;vvv:::www<<>> Ƒ&&& ʚaaa---DDD444}}}...njHHHKKKSSS\\\^^^(((!, X A ,x0@B >$Сa^hbʼn ?n!H$)D/]jQeL3q RI?S94gѝ({ 4)QF" 3*UL^YuPY~ݺkXMɂ5{+Vo㺝[Vn]kūؿik,6 #^1ZƏ /Ș)83\ -w,2黨l˧Uf-lضi{ތܽKݚp]μУKNسkνËOٕ_Ͼ˟OϿ(_& 6VhfCtX ($ &,u(J4<׀< `uDi$1>4Y s4iIx`)fI:A9J0  p0P 0Z#9P(0q# fri0\r0A剩9u8樤j*se2We"ʧ0kJPȹfPj TBTx`epZ)+ꤍ: 2iVb vD^ $ Rʁ99 €@:堮 L몖;%ۨ  4`@Yw1 @+H9S*0tz&Yd}r^ %̺hnBP72'@/)&@gz%Sb +0#rnw e|7~StfeL+L`/4@0ͅ ҋ/,L}#o@ꬷ~^-y}ҋL6lvʫ0 T:L2Y+V;j ̷-k֊S@ )A6驛^E;(*P t~ MBm< Z-J7RH G(L!{La! gH*$\* w@ "("|D<ȷ$2PH*i(&r`4<hL#E)/pxxE ZVG>I` B<F:򑐌dE$:JOjR(h (G9Jh! J5I.ypsva`RUe9ﴌd%D?x5KݯzRXf:H6nz 8IhV λd2D<9`< ]%v~)4q'&*`#c.(jMt e4=Y~tA@\Fф2`8ͩ<pOiU&]. lnZ.msHפ6$ @,o^A20OIXτhN6T JBۖ@L!AtJ-4ciW-ٓҕtHSӡeVIק yDϹ_e˄cnX]V]]h,ZaO."{EdXb+wM yL}u%_m6@ dm@\@*٩a4 Oy-* ^rVZ!U)XJ/pmlG [% :G8EVUnj TB;-R+i\Un:qG{)#M[y8ækPIJ宖"lgɇ#R=r[H_J ȲE^SHLh u+e.Hf,\"@j@yˌ^s<4!=OZƨ4@1[GЬ/VꅱjJT\]FRb+3DMfVم][e nxvZl i4j و]; W H1;$ dȽDwj@ݑmVۜnVYYw.)|PJcajVȒU'_'ty^0tAc-8-*l1rt , AأK`ߓϨ1ʣe+깐g9x x(./P`ΣCضNT`HO>)M|rSR0{<D@D1ׂyʙpئ1 N&MK_ 4c, {LW}(O"<7)$_rB}Q~S_'q7qǵ'%0sa$a' #P{0 p'%@!9(%p?m"]V|TC hPT"wgm1%#p`@ %@I8 ?'u{JH$`#MtÇN$ JPHM[A]+g+ڴA(!@@Al{u{ȉpGVrXh$rT"8@7#07s8 hxȌq'|D! 'COZ>0  p{"pѡ2svaLC<-%^@ (.@78!(&Xw"QYv$eOM / u`!X!ё_z`!%ws ( : !!.S)2$CZJ>( 'I-OYVU6W<ƄXS&Kb\m.3vr[82i^Y#V o3o* N{(RZ$i噥4] I\3*qn) o`vki2k9bMriLӷ&f1`lx洮4,id3kgjFr\c9V wK_iikYFM_R~OfNFke9LVh `HLO{PyCxqh x%P(su›W_dQr#z2vnWi3w%wzqk l'3R`e )mW/xx#KuGeztxǏ;臚{!PĊ,+0+ `뺰+kK˭'i۟ 9c&(}(~x_|{c@6HC%W?"^~7Gsʳ7%;-rx~"~¯5/~Ug,<^r>(OS~;i\Ǖ,U8Kh(P=%K808 g4xl X!\ۺ[{.N+€ I~꧂rP,X3oh!`y{!0}~9pԌɂXXKl-4@'|ʲ@/ܴ:f0˴Gꈱmѓ`%TY&`Fɸ@9l\*\gp{ C< N0s:02}ˁ,KL<! !BMԍ, , XPWm`% pf0M2 $^sJl#jlnpr=t]v}xz|~׀uG"*UQYsДjͬ\P  P p)#I a@ ` ܭкۼ۾=]}ȝʽܻ-Z6rmQ0CЩ +R:MD^F~HA.W*^-DPi0`n`p@3YH.L~NhS>[`M3`MBy  ejD.ģ:Q,{]@Jz d~jWp A~BP*~RK])#<&<Ҩ.^E͡%B| L^¥ͮ-|*@Pr.왜mz$L̮nP }8+r$MW U@©. |D*br NAR)O<)pHJIo%P)`׈.VKMRYi>NB/npVq_v"02Z_ plڦ € T@fw_N8n&b1} G0 1@^.'9_+-OP (, d浛~FY؟V,0L\ pl v@a>Iӿ #XA .dC(@2V`-rXa)SBԤ\LIEXA B 7b؀5$.eSQNZUYRU9pWQ)BX(=Id*U( ԆH4(b.[yngСKäEXȑ%O\eWfuR l1Ȓ < !D09 IHdZQ%a> ӔBptfsѥC<ݺ l/?JEmruױg׾b Hc&uиP.s!AsK5\M6l 4 t 0=fX0pE[tũ <jBP8@$ ϳP o3 (T0DaqK.? /q H_H!5#Ð |2WA "$@3MDUtѬ,H  @(a @SQ& TpM.5HL,S%%PMb@ #a*CZlQ4STf;%,O)H] 4K Ja<@*XV&ڃ@@TJ (` x`aphAE*0XScWv*a <@ ]^j Rziz 5 *M1=M?oH5,~)ōM~ ĠWu_x1%wB3T Ar)K(p-q0,03ዪwY;Tle_bDTaDZC2̇tKu`!7mH'ofL 5,ejW'. TKjB:;yrELaTO5)(ի{UҞ BJ HΉ&1Q5ȴ8؝j0ɭMViuv!°*P{Nnke1lfY1jmo}[W%nq{\YfD3ZDʊNd's(/TLknJa@%oy{^Weo{^$8eP-bA8 pR"A*Tz@{Hw]q=x}%%Z%Ε"@Pa`P.cF挅V " r'PV*,c836֦d]rn',4ٗBq|-˸0 ДGd[ڙ31|]A(08@m~sj:30@G? {j r.% "!&SFQMà6]M? #4m\ 4#ZYLKcƵC펴hZ `4T1Ҫ;+$ZVuua;6,$C\QC#QQq V;xʝ5Oj IMuN+P,҃Jw$PҫO$%u;?{u)@M50-<:S;S_K~^;u6Tj)PV)k>kNk^k@ZUl*j8^_HՅ^=uKB˼QMNgR&>Q~l>C=&n .[YNy #LdV&,&ʟiաֻʾf̮O9d˽ RrO a?}m6m.m_(bTWm PR %Ȫj"B%v6G.}fR.cSroh3=Ȩ <8` o^aM{ONT^JDN%p/f˓utaPo"<ְi#XU;Vn#H6=.]]aRܖbV7ѨsKA^Txunvu&6vފ&iΨsJw9\-ȆswmHHȝ$QНwC\MQ尧NM{/x=TNM7?nҡxQ󇰱j%kٟ}گ}ۿ}ܿPfuOzO?r;i4t~XqY57j@$IGW ֥FF/({an7:f „ 2l!a)Pd"ƌ7rG@,i$ʏQb ,1B˜:wg 8/K$ˆ+Bj*V"rʜ^c(ڴju H(aJҭ+źz/`a[ic3n1ȒZTѤ#sFyjТAMH |Jo5Rx#؜?ȫ3n*k:\:s|9)sqxӳ*=߻~ჅA7~U %W rDX]2FaFAhҀj7]z萄u#v*آx ~%" yp=؁A 9$Ey$I*cqX/B^800]zPX:J&pUvu3'uyɦBhߚU$0g 0~B*^vFhUYhZi)B])TN)Zn(z܋zꂭq*tzkp'G^>+ ljR˕K1{ArۙVKݗS0)[oJB&u&+DxtR 7KUCr .MXub+[2U\3X wh̍K3K4CC0hD*a+--ӽEMk^nu[]ܦ pgkvPs !Ev.~'+8;8O5]yCd1 9a(0:饛~:ꩫ:뭻:죫0WM%q-k; ?ٵ } N>O=ዯכ=}+L>??KO_JS(1̀A#X/ź0 3X0 n̂CH,J̃S*,.|! c(&_ إJ:!F4Ԅ#2N|"()N1X"Hhd<⭾;F c;#5'3O/#$Fߑi#xF7z1~עG<aE}œ`IR0$i$tۜ 0*C_x>JSҔj%{PY + e,1H]Nʖ)ua,e.Ceɗ4fwdi&șfvrh8jrsC7nRм93r:,&2vҳX<+3zs4d?~405Aʂ2VC#͆R^g>3ъr. Gcюr|I5*̒i)ETHU3Җ4%1MGvմ&(L/ɩ*>S*B: AꈰZ*HjzZXej9kҚիp]B׺Z5ՔhWAՋ`ktIb}NId+{4KbDlRCkі!gK:YҖJ x0\iJvA;@A/60zUq\B#mGg @0`\ 4vF^s 40={;Y:~߻`ƀ 󢷢^&p"(/ a㎸ LKb\Qmpi b(VAFc2&q 04NW@~p " SFEq<]@Y@@<,^"5a&3 %.pd)~0$0<{HAh~%gJzVAm,p \ T00k.ձ.0 T#Pϭվuk}kQ}6Mlc8 =| n g@"4ܽҦ{2H\羱[sKiEo~+ w_+gg_w ؎k<4(Oy?Ww0'x tޞwN@ t[i7禎|O`<w'SՃMsn[@ 7*f$^uq?c>4E# /%Tmn.HYL@]@aWY-B`)TNITC`9XC`.JU E| P b͵ G`R) (NaI&`;M a(kSމIT!uP^މ.!|nheQ!`!p,TIIJT a9(0avSa$bs\!zID0Lb0#ғaݨt"jE!n"5Z ) ";I+"-^,֢ X"/"F/#1:0na 3>#4F4N#5v'3V6n#7r5V-*a\79&9"L2֤#G9"J;b=H?(~GGd| B2I8"AC‡0(0#?jd&V2v:$pG$JOGP$IrEGFn$G${dH@$dzdJޤIcK*dxK>SvS*eA9fq$fF8q@G$c Sdm`@g.EPEdfC|jhbire^XrB8 IFTJIh lafB&fCDDQ&Tgib$m N@ 0P08@\00 dg tx~vghPt>Dlnq"vj'wzg|'y'z'{'||z~dt~lV$s:[A(p0tn H Cn'\(Fpsth蜐hv(n̨6Duj8fxpHtJx 80wҨ f@&*NFog~)iJVfDRJ̤sBii\i:ojB6j=jiQRjQZ*)jj\"cU**eiQ)N* TH\IfjrvAhjjbjGjNe;*\gvvv0Pڪp)y)jG.ġ. 븒z&RP~b+$rfn@r~Ɋhd (>A,l6rNlT0\l2"E2R% P>ffwi\|&m@h{,r+h2mgg&vj>nfώƧ.hjҲԾft+ΊdǼ*F~iNRmC̭nԭō$ʤ>fgjCnֆ2Dn8p'hD1B\nhhpBL.厈ciQm<@ђ~)ڊ~A2DC.}.i.GnBnce& jw@(i@ ʨ:&"|ofDd/I0/B8^cw{@/hvDD C06-ܞ/Bo.0?#0_.˨DJ0B<v 4Ú@>  ծp pQ qFB :J@sybe@@3VkdjK,wzI'F"B8,*H0j ؐ@ 1)kFr" +K20#cq{Hft|oq*0b0"&[+򜌲*r9A'D'{rz ,Bh&J(1-/r1C b2L1q310c熳jb~s::o3ns+Ě.9dz<=wK=z@0W&?s4FrVrsR4CCp\6?KFD.Grt\Bs)GMgItjf~+\\DQi4Jn斀@0M3>34; PY' uR4g/ Ir C v VOWWtɄ0ZmNG2]=vt_G F/o`PH(6H6usCHdF;? tA0ksv6IX boZgHwFwkj3 G5nFc@LnxGtm@UoIlg xw8C42wTw&}rDyr&i4rD>32Khӧwh64?wsg4jjJx]:'^8bfA/s˥oox`Q=5?w-8z;x#dAg7\79<_DyWxd{22íy098ZC,8+w9w^繒*%LU'ȡEc3EŤd7Gˆ+}:Wl.zz:S6WSkx9:: GK񬫸z1xb1F׉=OK#;SN댻0{/{Fl;[E !þO|Ξo< C6F(0|!9#<@HBAD+~[~3~#kc{>>/>o~~~>뫾>>ӄ ?~> ?'#lx8D/B?W%w#DD04(!A\Ȱ… I<a!&̸#Ƈ Ghǒ*OLp%̖2_V #L8„m!9f̠@9jDsh͢?ٓ)ҥGJSj(&*tըW McRm+m\sʭKۻ{_ ԧ` /&rzWv4#W t熜CkFH:4ҪS.mZ jѧ_պ[7ƒ6r޷8ç\ʟs'wS={g1<`w=ǟߣ" <\|% - 5!x2E,Ca@U\]|eOGm̑} #\&|J r),ܒ /2<ќP5|8Q9l<ܓ#>BC tOD ]FM$5@$`(#K3}PEmMa8 TMTTUeUQmWKm@j@h@  @aNmW&XXaܵhvbMvfvi6t]7BliK9@*Xa/`. UK@yHwᕗ^{՗_a a%fEUx:d1@\@!rEf_ԓIg9pwgf_s`[ouL6QݺW_%X:M !x>ـaF݁5f $]GHhWcn3րpvqϘg{|M?=ђb;a}Z 2Yaw\Z u\uX'}v3 tQz4#ۃw/a 0@^ V4fV՞OW@Ⱦ'_|7OP?fs_X-)*O4( @ܩ%!(TX(9̑ x&UЂ= :SC hl4gQUEm\HE71LIDb8L` bdEБqb(D7 l^|G%F"đ5d$7KUR%87eRDv x`a䛳N-^ze,GKQ^R AC@0A(?!ż㻐LfpIZqQodI 2rpf33"+0]@z%T!@Lb='|1{T$! ю@*:>I5ԨE1ƍzJEA71M$LgAT4Mq^L@P3(T2I] RT>o"xBPI2ORUfOB,NԑaUV^d}Zj |+ZgYWR/'*\:ؿt k_ؽ!`8ɞլvӡ.Sl0p =WyCQ7]S@mm7(0z+yu7=~{6{]u}'8x?gPw}[~[:ouwFoAlN&oN&B .D2VNL`T86OԯA.0aCp<','p-H UMqtHx@h JN@ApA 02'NAk А ,  Px 0nNꌎ IFB2`cnp( 0]@@4 Q_U.Q N)C<H@xގNXI:O0 D K wd}ndB@QޮaeiQ,LOoOnJ.o¯q:`RP܎RQq y 1QI1>OX+LO<0Б!$%n%%G/&1&)&sА'c'M$Oҗ,愆(a202n*Iq 2nu+f+%GQ&RƲ,urв'-*pʲ`q"E215.3z2#͒A"r! 3$23-"(sr01-*SجP O0N( H PIqy67s+nSA77g2888O993i0qnJo`P qPQ @ ߳+1CR0N޳!Ss ?Q??_Q@3RFGMD{dC9RQ oݲW"\GNEHkFfF(GCtG@%{Ն4HIgMIl:֢ϦJGC KH6׾tTL)HML9 M֔GD4K NINsNI4GLO;LMM uFM QP-QmQ'5uF UQ%USRR-SC58UF<SAU7uTTU_UT5FXTkVAWaDWiUK{UTfNX'WMYoHyuY)n[U[[[xZ\\ltZ']]GY^^K^u]5_`V`` `N!_aa_v_ha!b/cA*6c;cVb'V8cKdCAHdWcQVdEHeYVfe$fgg f$ ;PKUPPPK"8AOEBPS/img/xstrm064.gif0]GIF89a^岲@@@???rrr ```000pppooo///999___OOO髫PPPvvv;;;tttJJJ,,,[[[XXXggg777888666||| lll:::mmmaaannniiikkk]]]***bbb^^^qqq>>>wwwLLL 111jjj<<[in !{GQ_xWD|̏|]!|gw/o觯=ԳoV׿o/ `h> ! ^FߓH̠7z GHv; 31p0Tp&J_ ovo< pۓx$2PH*ZX̢r-hB'fd46pkGq#q}>"% 5KiA2]ZNdˉ.S"'MBUDd&wHg^Z VG5D ZӢ U Yg6l%/YF:hA .F>R0F+^UJv}_tόx=!I^k/v،K Ey04HAɉPmyn xZ#V!@.J t%Ryv> 0~奥5aPREc.*U7;M^O/HVQG &D'~)Ly[5RM >[3楸(MWMV@ r>|N$;S'tNG:Cq;CP!Ys.K̪^9#%9[&0'Ժ6:`; X mlb-0"s|p3S tD%d:@x9Vhqв kت@+N`Qu׋Jey@$\laZBގF~{ŀ퓾b>'08V#6Yva֎;96p^, ymM"X^$K!g>&ͮ65π'Im=%.@~=9 igZ(VGMRԨNWy"Ns?@*Y[[I䞄eB7M" NCf6xDb=5Fт ͧP^8%Nv7 Mi-]vRk[j<57aR0)|;a.󆺄 ޚm]'Saϥk! zw`7W{QD(h!O#@+h! ի`?*3sq|,n}zq/0@(Q@wW00["YPLhX0 pq P!ɗ,IUv1 (`2+0J(v+Fҁ P"O0K0cv(0A@vP V@P { np, 2 b = ,xTU{c` ޙ}vzx,HzHPяEp3,X Q0uLJN@Yd H 2EʫjPXX d`a1ci犰hnHlSѪEY&z:P }ЊrOMPwxZW _z`*ƪ*7pp0P z!z{Sc:,ہX z1::)wjcZ(K vG0 k  ìD8 ¯(rh{O2_Pk  Af*N򦭁(h 1-P#2(㩊h+P- z4LQ[eGʧJ GI"`P0b pB5@<0U{YKW`е[2`SF]kru˵ ;K⅜}{, d8XW fпր bqo4icƏH֠[ ;#q/0lci!#x݈qWI~$2"/RaR\ܚ\ 쪬K;I'LHK 2L6:<=lH0P F*.NQT Pv6) 3SRE/vJIcIl 52h \ g_cbkRN/oav#F=[?˗,G|,M P<<\p laGI̾W `x$;4R!fh.eR]UN% (htK,|0V,ܤatR-Q!iƣ)] sQĜ9' rz | y$}̵ښ-:Z`iۘ4-y9 H(.q- ȉ0(. J㘫 : 86. Nf3:ޖlv8\ 6=N(AUaEߥ-`Ր![jwlT,@[ ֜x^qq|bx &rtN`ՠ^P퐝ԣ pHd4 %cx7B!G4q^#ލS'{q s#z4iINPSI1{̉\!h\33np!o MEpʌmҚvMIjw 5=ڶRbcPHܙ,OY%yVl|pq> W)n4?5Qݢ{k  F/ƪyjߍ3PQZycd?qf_)/LCp|vߢV3}o? Z@9S&M_5+%oȚ }hd8$~< mP _*c@ |~u$Xj V`Ck @XѢj f@5`I#"<1ɒe^<%BtOA%ZѝXy… `&M&cr(IrDXAPd]m'^ڋyۗbbp!3% 6ZjI#0-ψ=P9!0inwш@+a3X'h{dI*~j@ [R!B5(B`@`P# @ g^B0Ζ*V)ʮ~kaN<$!w <[:UyMh]0j+`x=Ty ؞rjx)T%m,kK!i/ JX×wB#!*cċ&Oh{ۃnrGsLT  gjw}% X:u5fsT:`|>vK@:` T@DwK-@!00dpfWՌ^on@X 6}z>X*5t:X V%HVБNt0kd@Ȁ5:`k!zk!ZL_hV5>`s[ZL9B>;Nhzn]d iD!8iwݷz+>/!!t \=3I =kn{{,a\@ dso+ Y>+3 Sa5SPb @55{˵Rc1Qx88@.0JX&K6k {qĒ oӀR {9LC; °A#:JPTB#¹5!B5`P-T/ԎӃv9s+Ix=K RYoѽ{H= ?7,ÇXApW E*h0D;!Ip@ EBм''DR⻈ 4a= L˰{ CCcԹ;#>4W;F<> 8lFH퓉Pxtj, ;lm,n|S7t QHb:y|%xpś3" Ǘc2cʇXJJkp ؁{94cDÇ0H,i“4,It4Kt70}p-X q-Q @9x(yJK욑Lk\I6SA8„8x 9 XazI`IH[jȨ/2X[ n64IEDIKm$)nM|M |L($ۗ)%p+F{82i6"M X,͐ܙlD-;dIˠ̘2u~ё, NY] F;4J2Ą U0 p QѣP R ՀD#|Ѷ}ITrѪ4'<f BAFiS7})Q`naMaZ`^]-, `30)EbQ])J&ha((a΋ `c@dAl9*ANdEnB~ݼEdJU҄”JdOޚKGRNdS>es -eT~eX\MV.F[ We^P:d qk%ee^fP¬Ơy> 8ʩXGEtPbfpgqeH Ժ = оgygee],JܴZ jN37l;hhEf4bn7UTEibV~pj: ȇ ]"D.i^FeaYPNp+0:k7#]i[`^Wa ,q,ojN]٧ۂf )jjnyk"KʊAtkNZ*hGڱcN뤪eЀG!Kfžlselbe7f)"*Ax>҆e̞mNG9 X:>éȺX߾ 8莬m~naeވ)MJxGy|t~n>-n6MTgĒ #ko V@T9>쮟oJ ؁ o jӾf3Fx6.2,=ؓEi _)gjâ;t.jsNlXoɎ^jj?"xЋ4i~)F#Gr-o%o' `r3Oeg/璡h2?s9.o58s=erdMsAG>iCtDO ?tEo3 ʒ#7wtK?o胎tN7stQJ3uUO_P<_uA)BS,uQu) rtu^s_"\gVbc"`agfwg"Ii@/ ^OstvrO rO^muowwwx-gwzTxIvw@.Iu}VH=b`Wajw#xۉ7x7NcxpIy"UHS,A{-X|"*>-OGOl.IN"L! U- tGr?kPYU#" ͩ `yC%P(XZ$z%i+ղ<1ɳzzOo2 DIȧ8_ZAW5R /Lk`+ Z#Th X q*(=}Y ?c G;T2'0=ʟT"( `.<|?}}p*Ol[x̯@<#jY+h"8` x@BAAƂR( $ʔ*Wl%̘2gҬi&Μ:w'P*$ha F8т"PC0 FPhA 0h-8XQC ʑ% j0Ċ3n1dC3VC`Zk-d 1 J k8dB#bT8V #"6,Ӊ,R,{ k:0I{-+,zm?40.{.骻.?;/++uݻ/7^.0y 0 ó1ŏ-13NJm2%A9 i-</<35|393ϮBC]HtB74LGP,Tgm5-3^?mvhovvn-wtmwּwz6w݄mxރ+7~3~v@;PKFA00PK"8AOEBPS/img/xstrm063.gifSQGIF89a1岲rrr@@@444乹(((yyyNNNхgggܿç滻ttt붶|||ͳAAA###η777~~~ HHHŽooo}}}555ppp??? qqquuu>>>{{{IIImmmsssiii===RRR666eeeFFF222;;; nnnlllkkk...000]]]CCCaaaBBB^^^333xxx<<t[MG6p@lG ?0nXB1 :e[0L0%pB7Vъ{#A/c#6dBn+ *Ux!_*PV,\Q,bO8@avp*jQ0AAP(!8@& P@ p` WG$ d-0| >`0M DMҮv˕>rXp}G:| N@l$(g.e~ 'v0 @pt"З`~ NǁE_.yC^WD@: O8&Ϭ*HAT8 &A  g.7g}}~P & `"'p30!PπArpBlQ7jewL/@G 7 p 0e"ʀ%x 8$\%x;zsA @86Є1bpSXp U.P"Ѕ,&QK F:8s'`s`0¤p 7Z0E@_z0'  wH == xt<0hi`r h@E@ Wΰ]pq\`wH! B'1b `J0QN00lYy0 #`x  0 psH@)80 0"rB9DYFI6eTj6@Vu ` Sr#0os@Z;p;I4w0"` -0tYvyxz>@YRP dWW@ـ &oFo`P6FPp&" ff`a  g08o#PX&Qx!QQyP &y GIZ C@:`3 ycQ& /I1iyefIÉƉ/p.5 q D JPP]IE04靥 8o0q[ܰN nQ"uAQ-xA; %Tvgiy&:<p7PTZٝ١_ p@ 08@  `@ \ 0 ̀@Pp `GZI0Sf&Iy*ڥ_cZg*jnhy; ra!XI 0 x49p%60WG -H*XJRFYy ` T bJUn@ pk Bq"Q0NsX0PYTd [C N`0 =А% 0S`0հ%ꮣFTjwmp@0 ڦ [T`1`!DpvI9"\%P$Kk`o>. 210P[.n1 P'@QPqJ `Yo`p<K'xQU ,PnP0P 2P |?n;VP wUaSwK@U|0 Ph@ pX! ᠾ^@7 k A`DHPL &GLɺ{  td3p@W7 }@6` ,ȋy0I ưP {p@ #KZ Z _ Y%pbpkٰR` @d@`a} P1[$vÑUQ+ [ , i (@ pqP ,P qI`@k 4̫:10Qp1L@_İp0%D% > qai|y PE zz~l \ n `Zܮ |_۴Ʉ@I0@ T 0ZÀC D _p L sP \  ,}Llέϰ,JVz#iܺ+Q9 3Tp  C` 0 - m` 9|PP >qp(yqD P`FdZdO Mi0" Pʣ\ʧʫp P0ۺ۸ A n pt` w P ppD cQ<8p ROhSk $ R -3%M aj[&IP `p*"mn_X N^>P`P] w@M0 ]}ѓ0 {\]p~  M߰6!gj۠  O O_ﴍNޥ7@6͠W\A`=,/1cq>ZP 5 #€J@Q`~" 9 6WyP [_]a@pVp Ѡ0ð?m/엎@ "?P oP 'm + RӀ f0 YٟZo_<= F7hp3\0^ !s5 $ |Q\M8f IHn(uÁ AXLI1eΤYM9u'L (QI.e4S~ 7ƒ (\d A+ 㛭 E "ؑ?- @4eX(9bv$AO 7C -B2c矐jS)W|oBɕ/giw5֮_Î\;z )vʭhv ß{ 1cb@">L0FĈ`b*aNZ` Nx`$ㆁj+BH9$?K /U1[QH#Va r#= |+$y.J T0vvؓXdUnYNj8Ax@ 8ᆖlc` >vY쨡(eU_yw_E_Y,҅jvn zyǟ[~! ugA扃 Kj0!M4_DQv9^fƟi`k[m\ V.Ha TvY'N@gT`{l6j Ljvb~hb馟VW4QdbuF W|qƇ}ɱem\*)ņ.:bf"'Y죐OjX`[}vڛ{( *d#-:O$$8 bDe0q94OԡjIwXYf|7/}?vrB1r_bGR &?c`@60-xA ~`6a !\Yo D3a ex lC 0l.[PB/"qI Dp=boı \bp(*l'NqCPQE7"FZ A8hc>` G9bP@&Rs@8ꑓLY䉒yql҂pe)s$0c:P}e-O#eҖKy%(wIͬ t(=)2LŅD$f^SNcL-I6e€ @9Nx1 p`MxĜ1?\р! $(< WxSAOOXB ;CEѓH& PG:J5~0  j0DP(406jc<#ʺR@z@,xn@vĢHDB%@:p j@/ "@ G</$a9`%Tt@1ƊZTRիfB3q-@?x;W{]%p\<7MrӦVP(RЉ F ,?P08t _FX};b|D._-H* (^!bA%tl@?R`;P1[ h7b\.PB>\p? gh@&ސahBN'@855`@\D `A PR\rٓT vhP(PA\*P@&eȣU B,8 ddz퉧C}l!).@ ,@,.l +?y %xC1ыkB ^P"HHbP [ߌSR9b`1.Lm ~`6? )6nMÒ&E6`P<ľ]n~+я4$AC(@Q(ZTH@.-l,.' ь[[̓lSa mHH#OHW:tL{̈́5pq f;(q`FlM!>0;8?pQTaT$r9^G ؝.%LJN?G\!  $?t e$1kT .' @22tqBaP AА" `z B1 9qxAtPk2 ; klnd@vOsw(YBV9"$xKl/tЂP{BIJ(3dS h5HCE:dha0SsRp3^3@`xt^_JDpfաmp'+Ix/k( vZH"23X783k@@3`6x Q Dy|*|Cp)W8@Wp0KXxI( K(S{y/8B,$/.B W*eX=0ZHJ 4 (sr'xhlF Y`vxahYu8iS` @eS .D4qP*K (;=xI$`{DX0X5 0*[HM1+P@Ѐ;`C= F}iMx&Tx@\:Ӓ'mp?Dd(]dYdidGV=H I^AVPeQ&d&$KddKeZeRʁHeUv9V W.J]^4ʽ^DY Cs~=f3I fqf'uU_f ^{=\']^_o kl^2m>gLg Zgg5gx_6z~v0?gPgfgv}.~ZN}fXhihgIH jSi8KX 38e 5@IB~ĆDxah(HEpY+9( qiBX&0cdޕee^kJ}bGC;@Xhu؄b G/MVO?H<#I Q<L_x0yYzωKw y`w؆LG/v@eY3uZ{o{{{{{4hwJPPVC*3 [xz ozf7kgXW`4E haͮ}ۿ}/`^GxoH>'9TR*pPpzotoNdȆǀ6ܟI}~%HhY"#IB.Aƌ7rG($ʔDgʘ2gҬid .l a͠Bj̐C`,KF4fy u%;l!D\Ϛ:6#REp3n1Ȓ'Sl2f+c"* /@T* 15%N%RHcȑ%%‡͹8F*e)Tt8'_|hC f2B0 ErJ¿Ph&1kMȀ1)`C5< G ` |'FC/ P:y/T#bTs,i7Q$@H= >тML34XD*€UL4%!$Wј3/UrьbdI[,_`.z1UI/`Pm"cXC*!X5+"C= Xԣ&u# `VѪ?wաmB3ܨȀ*`W+P( hb?pZBEXlA1IJ@ &!ُZ6b??8Ƒ z=hQ( P?/<4d<cNQT,u)LeJSӠ`OE Q{T(NxjŢ]oP ЃH V %(B@}R5.d`F;v`3d@l؎#~6/t{?abx1J`Q̸71Ic@a. V4xM9Ge6ќf5k"YHC(1`FsNwSsyANu*\t9 qBFZ$1<=AMܠ8B4xȃ!@ @CDA h0CX]$l0 lA`1pAM]L؝FC!<h][)Ā+eLper-LPL X)?B7AXA(00>yx@!5,-`82d)Cöa cG(d 70#⚮AL5B1?-6tN8$o"$:8K@PL d:/=X|`?,@0P<猂!Mt IPRpV7M8 8b %Є(l5nCn.C`8$"G^>3AP%bb&v4K)۩ť-,CW5*\Fl,F#jD8^Q]F-4t'bJb@+j`jD 7(;<܁C`y" Ѓ 2 #`@+P(&AMpk.F7L+LfnjZ%`\[VPvDqq < t2!cFTFL P-B:LC%%C)8 ?x7BiQ'A(0$C-CX@8xB6jƝsn(cl/,ʄަ,@BUaxC (D8- BfPpj(jDP<#]<*FN*VB"xd(Ol=+)8ꥦ**N*0<#0EiLd?A,Xq#&Pڢ @C\KjD,.Jxb8nGEnJ܁ʠ?(H4M.4?Pk: o*oFnٮ4dpD&,B0;?<؃47?/`?CIxBCi  -p2b,jI_ATuL\C*p*Հ 7#< C"\ !`(C*(MtpG|0k/AI@`p@Öî:[PI]DvA4(|B@"@2 "5xA-`=@@%XC_1Gqc*@WF2/%Q5#CzE\IP bL)Cp- 020Fh1,-k)NNMDA" lC0"?3HFo<0@FV%C A"L`.Cp?B5) 6 = ok?T$A9^V)-J .pA%sL!6T,6?b-8mk P!08ǵ l!yeg>9yg@;8ԂҖC1x9FTe)QXvMx[9`؂-0.4?cC* d&g)?zF`A8,N"z30fkwKT l6P@ ?ăOKЄ5tnD"oFJD^9dE/87tc*d6omiCzD<$E,@#D@?O{_knĵ3T,-8I6i$ˁ#PʝWj Xte&?q?( TnV(zZ9jE=pY%-pL`g;3 $aLpXH- tB=<@o? @Ak:,W@'LFxNaƴ-4AKN;%QQ2j(vB>`/L 6 ηw~|03$P? TH 8@?*K6%jey,zV$n idO1b| B 0nl - Hl5TVhh(%$liU:yB?h*8/#0k)LyA Xf.k#?r0bßAPK`n2@y,hi6pi8 IXG hWYH1 ? s@S<8[Oj}n_P@oŝcp>!=dLLa$`t ?XfESaz) "rixFKCa 2x"|C(AqοnXJl1BC ` #yA8 >x`M<$I.`LV^x[0 `ؤ.!8y>ig\q/rƋi;Oԯ[*WAt嫁 l(>&xzZ Sxj\Y) /'lXfZ9C.Q Xc`XFلPE|9FʘB<. hB#Pdǒ5-J4=Eo@b G[ZъUBq(K@Z"'C J4773p2,I\Dߨ0mH:P?6 $tВXn[f,x4ڝ u@ XRO(A;/$XРG1?@Fy <E#sA1p'ulh[x4B#P\3xS*`"0hKs|90F2HwGCui >mO, #@w!cX \ uq!Pc 4 )W# ` %B`G42`9 @9˹,@,!I$zN6uE7.=.D ~d((01z@qvLM 8B 0A4dD. S0V@ 0l@!؟+! Bd "gPŚ6i?ADǞ癬C(ЂR#1WBF$Ќ[a \G$av0 p7e54|TA$&XA7LPa G  *h?0. PD YKjFr!i|uReDhTItT,09dX*A^_U  cՐ,ХG<"LkL`pB@6mtXI H DN`˘e _^ !Xp D}4`R,a pA.E%,P2@a X^|?C0NA9ȡ` Vz5Rfp@  "ҀNH h]RI8Pΐz"3IU > l@.l!Gg<}e^n7@߮/j'pxi 2 {6/HX o0A70cX V?D0r!%07 wXB+j(sf= aw+^/G_Ixv3_Ǿ//,Cu?;!|(G`%8C- ! :A J`H?PŶ^y l0O̥Es?, :K^t(%& 0Pz K;@ֵq#Ṕp]8"q-+ faW9 b/NZr@bQgkosQws $@op uk_ ofܠ;AFaQǑQQ` ?/Q JQ>7%8@M]" -Q#;#?$@Ұ"!yN!G![mpGwx$" >6$w'{#E r&$s.%o%](i(&0# +R+++,R,*Wo$)([(/)_!"Q*oұ.G$%֒/ /*[P 0SS1y0Q01'3/?n 3'/@5A4'O33M AP!8zQ7w7s xCHO [h;{97à?P^.c|;Q*]"N;S={:<[;R;ٍ;>Cc"=S=@9>R1S3@S>@]?B'')@@DGDKDOESTEWE(Bɓ?5T\JEoGsTGKtFi8t(=GMBH4311`rwTJۀt&JTK4$KTL%/4u"LהM5[ NNaMNO4O,3TP8KP13PU#t345vRQ/5'!6%U5u\,T@Gu> TCTWUUQU_%ZVo/cU gW!CF{XRW[WqJe2X$UYZՐYGYZLuZɯZ[-Su[[\+\{u\\](]q5= a_U___`_ n ]#Q3a-^o!5'W II@ Fe @ ]H)<1|t,IP QԝC&LhCA!UvǛpn(Pp.LBX ?E `xaˆΎJyvHI*A.EɈkW fCv 1 D ݠEAJ $`P@3D`ՏΎNi#U8*Ғfb&ISRܠ0i^*Ӛ4J4Nw0@ PJԢ.?wԦ:U7+uH)@U:qE4xTpAhGPUGpA#tԶ2* $!9@Qկ?@+HƢ b .x ȁ4$dg h 'm¯A4Ԣ) -2w?p$ +]e8B;8b8\p `n{' 4Jphj8yi )]L?hQ`{=`3HBq5 br!pNqI#R5 [HVfH"Y"@j?A a rY(,x 0Q8WCuEӦ!O!G610pU|3b5@@RBS`xCx ܫf6y@#:YT ,  &^x(J,_{΍)@lb9A1EB ?B 8? 6* 70^@ )2 ih4Pd8B~(A4@*u]I]jnHPkpP CFԷޥ-c?Ѐh/ th .8AJxu4׃ : !գzժz Dp^PU:t@Yp~0~gcPt@Tkw`izH 05TJРjoP@Vжo0 p0`/ p q*c r O&@p* OJ J_&¯ظQȠ  v0!?[;kP &` KUjp0&p*ŒZ r V˺Uz0d  ziG`Eȫ[AްL00 L@$Q@`sE0 g'P @ pP89Y@ Ǔ= s)QS< hs 1LL

pc0 6K $P5`@ q\  %bѳ各'p"PA> #0 ?RД {=PJ`{0p6`?p N0;UI0 ;ܺ8xZ+Ĵ|չ\ PPy | 9ߠZ, 0 TVK 4PN%£q`@ , Z0 g0*Z0{ ` RBV}}]Dc]gk֐-s]0\յY nhl,[Ipٸ1 Q@~ϔQP =aY0p=VLP۽= x%E@y`(D ! J6=Š]!s C\ pP  KF @p tT=Z\)Np as0Zp2)x*` !Pᒎᕮ~!#>m{U`@-Up?`0"0ڌs0@*@X20 +C CP8p@0p9 9DP>pc@P -0 Ԡ-p u " <@ d@>;N^ b}  M |u80C~ LUu^PPp(o.ϿJ  Q0p :q T D~ o@&)0Wp -w@W00aN=A, ǒ PԠ5@g0 Pp $GIlM pun@ P VлI "0$>໯ ^gQ! Hp p@ A  YJA^2vcc%NXѢESz\G)$MM6`4 Nik\7)EyNMA:pA+WJn(*T(QBBJ)XFd(*V0 DlqU+'3vr҃?aPcȑ%OlLg<`Txxp IfB _pxAJgo 𑍉/trE,d'hpHC 'ŽҐȕI.m4jIJ> ,2 -r . -HL6*q9.B=C -A(4R[br@{C 3? 'V)鶒@jGh@"`RQ"DjUb!:Z: HaojJ kJkފkZԋ/s!O0AFuT 8 E \FTc56p;cGD{ގL2<I(*u6@C \Ve' 3&+$TRUr2UbZoQWWtv_~v?™_EQh\uP+[WO\Em$QLK7i `fsyg{gzhٍ<xX 4)'FX}lЅH!tKI{‹<[DHdF[oUE{oo|p 7o*>إdj_:ۊ֖<(A C]Iᔷaޗpc}vk'|`\~ ZV+vbSεtѣL ҠbW^a. 0a97|W}w}~ÄIĞ6#Q"Ln_0р}/k (5n1/x w@ gދ7/+W8D9#$6&<2)'ZR1d"<0fd-ˢݶ8 %TXI1:iE7SR D=PyIc ` P G5L8"Eέ^, J&j&LMB'ghŸ 8 h*<$cChOdPh}/)/F{$A/~cPrY\sE*%7"Zd`Z9 v>D%H,|a %)֍p@mC)w#AMRQ9.Yh!8"1A@* \ &!)XX==Lu^$Noօq>=p+B^N@xB Z@!ܡA UoVGA a@~mۃV`a' }?@*A/tkzMo 5E dfn|~\ΐKA =]M[]yBQ* gN8,tށw>{wo^)F/G#*|ew:@ K @4@|(8S4q?*(IA!t:40 >D>kl>1!+B:­HXBY̹(?A+=L&-, . /&A8KCDYCJjCxވ2' ?EC)a)KDLDMDNDODOm@cq=ؾ/=:|+8jpG,2^ n4P >_Cy6 \;H,@«wFp GqGr,Gs>>BBBuuu<<)TViXfXZvYRp )Zrly nixy%rҩ矀*蠇9'&_'66D (c aA01r8 1,9ꪆ-r?pAxIOQ"M3h ? ,c0,h %8P@ "(J6 SYObB 0L5ތ0@2q y"`P D'<"I҆,rj0T?Q/@A--V K&\AP((.O&F n&U(5Ѐ%۰ 5pYrAPB/3L2&v%>TO z C2yP?FC%`D  $ǐ>L??dsLd18a%bOq'sSyGq :xbqAҁIX?O`2Ps+@Qz380OB.PYD~<`?.[7,eXY˦']4 $|#', y].s >"qb;`(:7!gW4`E< Լke۲@XA- Q\@qh 7 Ԡ2 v Q oX,r m$u `X@7d?Q(Mb"^U8U, X%oWb1aBMx x XdUH$0 " xk :@K4A 0|K ;f!]P)ۀA:P Ԁ )H-Ā)0 / CHA ") `G 0LGdXDF $Ƞuz׹0o 4-"xp \0GA!X"l ҋYH)E8pSW07>a 58%p\ j> pah)VPp ?ʐDKJ0D3RFkE*uC|?-A&:&vv P hBQv%bH  a@ԨN+@@D ߀U<vy̞nA",$0NĠ՝ kƑG̹pBUMr?`hz 15]# vd# p?"t'ЃA1yDl"!07~ `LG'oyI??h0.wF5LOs$A2o8 p=\VP 07`(Tt" L"۝!B8=+=B 7]b Ú( eڇz4$KF#HQ Jȡ Ї?, aЅA } 15I C&T *M]ymD#W̮:]20?,tF 0{`E@P AQ`Bj ]4F,ؘs |8@?04WTK g@>@$PdPR ]  PQ|puY'[# PpY@ ykEp61 40vA p %@_\ bgP "%;@Q|PPw:s i 3nDkFc؈o` P Dưxm!` v50ZȅL@'i/` `#$0yuo ) A#ps=gKQP ڸ؍8H` `eL|h@ ^ ݰN@  M]c` L iRM x@b x5PsF`T5v2QSgat!Ҡi C_@ !a 0@ {} @ ``P0 v %@|iSp"@` Š sP/Is6<$b Ce pVAk(u v3P A`7З)0yrO$^@@ ]Py.$ ĀbMMf۹ " o`  4)yirY8`BX0 P>n$9bPP #$` U)ɜ  #3@s rƈV>P3$~60QvP ``DZsU d^vy Ϡ>  ``0VͰ#ڜ&Ir!0p`  {@6B> <`QFX7H*p=% 40?0tc{FP !@ P11L FP B ]` P Eg``e_ p蚮꺮ڮ Ơr1t6ɧ':*[@/CJڣ٩ 4IUp ) v @*!l` }p .p``1s ǹ`# 0{gM`X,p J`Uw P F '|pPP8qpr t$ڧ rK 밓Z;J?*␱4Ip&*Σ`s GPe` nQ l`e [0 ,, = -0b(@ !P P 10v`zP Pv0bPWn;;x!i)Z'! f` 7P[/3`X6 8-aR E!0P0V] RPO1=@% B'@u * 9k» p  mdp M?ӀQR+| ctr+[k v` kj L % P'fPp` @ кMPaZ;  ` ꃭ blp*_B1 >X̾Z ɰ0p 0 A9  & v@>Pp7} qs\  [x6} )}?"I 0Xp8@$@ ?`4{ P:h0 q& + L7}@ p2  i+060΍뗌([] 0)@@? #x WZ1P m`9d?6{V]h+xJ]̵o ׀< H x0 | ({ O ]gH(5`#~ZRY16 Ȱ = @6:>BީDNR: $Q>(X7miC@ |`p M 0}ɽ@ psNvF{.(} n ? FJԒ^'ֈ e,-w20IPA0m Pl+pX 3,o>t1ieW4 ڞ{J{ ~{; ۰[` \?_(#}r k̸p.r2?4_(. T +nO ",.?0_R?T?7'9`;@ KA/#OIsP!Vnpr?t_vxZv]{@4z@ _|9^ΐ|Wjoyۯ ^p+C@4K (?0 Jјy /@UP !0 p@ /OI#Рt \?a@)` J` p Я Րԏ"n뫷X@ ShQbF h0rmPc D@I)UdK1eΤYM9u2*(*FLpQ_FEF^R!F"S./r<}R!D-G!GY]y/K$ %jRN \_5a*aĉF$lƔrIekرe҇&]EPH!"ޝ|4Er)PAjŏ'_[rnMqA@r$y8&hL"HGvlQ*&2$B;K=6z`o V&TX"A*an< pH$t)P-1O?{!6X'@dz|_f P<N:ta5HJ\10d °3tF)@:+MNK3Eş\ FTE,[ԒK/b(>@g"@ b)BxGV{P?Uw%`u׼ʱsq^|MV@\l];*>V0ǔ-T 3H 7wXaCY6XhL>ye[Si5kf`eTgm֙|h:eih#jκ떹Yl./sM mІ2z.on\'|ppWqMbËr\'3?Rn tIG]WH L j@ :r %\&x8:h=zgThCy =RAԣv&r ~kIh_:~8l`A%|/LП'OsB%#K|  u0 l#50a@v -@CHFC|O{"C 2#8 # D|db? #u"' {]b? " 0 .F0H AbpX !:K C@C$m.Dr@sCB$zLtG8*^qY wEqbwhƏqjwFqrwhǏqzwǏr!whȏ r# ɏLr%wɏlrNpk0P0y Rz@xPԢFy*hH 0R^U\ҖVq.@Qj"ͩGEQ j9M`Uv~ĩ0T[ZUycUXzkMZVs%QrtObC f҃;# xc ﬤaPC_-ۡ` 0pzY(CG 0dlkSEhAKXK0Z +8 vdH \yX!?p $CtDuT׵Mb< 3@T5Adl@HA x^@pOlBP`H5~ %֬ RH j1 m21hE቎ ,70 9yhC7 hBG 1X|0H D&mjÌ@)p#M.H, .(%>^@Bd?* $ԃ%0h|؄G@zH$6+"cۙ stfA ] HH'e!/`?D q`@40E{*1v$*h &} Hl?@9 @IAf#0$s-b%Bwk"WC0y+DsOI$ H# !UPA 1<;@͑;\@9|@Q@@ ű@ p@d?:'0h*JAB(P{j( (AA h\hK+ <@S0f)( X7Ba (UH9);z 8IC?:p#<u0}؁ 0ZЁ`hm@`]0<\-M η3ES5}#7I8OLXC3n(p.nHsEw|Lfp^ ph\,{ l\5t-P PЃup@`Vl؀Zh(H>z 2TpA$H  f9&W{}JD>Ї hHGSȂ&̞OY |PZ<(Q<@>ST҃9P5;8igܼ~Ie0TQO UA{Z\78Q8 UHOeL 47  @KhKT @2x8L`U ,SAP;(C8@L8M9sxFhKzBCH#9x1HU\ N7l baS#ΨMbDb- tbb b$S&aM,Nb-ޫˢ +!&&M-,h32~c\bb9!vNcײb>0? dײ9&b#F0V c.6,cY&XߵdjcbM NeTgtN4~@Ov qVgxgygzoFvn qzS>|f}3g ;6Bhf6Q~^hK+Q c>ν>c"ei&~>NigXi+xphƇiiRiΌ*Ѕh.T4檢΍vf<^ު[ Y|Qeꎞ A8|Q⫖${yHk;>@F@6f@ ƐiS~k88얮adG+ZpZMv^N jK8h!*&)8n "8u@p(32@cn3؃G800XK؆0^ !6v$EȄUH`No^o7/Zqx0< zp"d'H떐o>9(~pЃ@2(_h0:l`4 "9 ?+g </hpq1> W`Px}`8>K#0Pqx[bhP: idq"GfHs9@qn NZdde6H+`I+(Gxhv b>9Z@sRq:j-@mȃ:CqOhG.7"0upf8jpn)Rvǁ>XHyЁ5,]h8 \uGt`/Mp 8e/s@iO`8Ȅ1Qd9OP@Xt^{0(lSsuq铐#Oր ؇R|RP+(`d8gxsi@Q8FH}ptXRuh.0baj? 1Py ej`O'xD0a`(AL*zXT N$f HRs,{#~?~wMP{Ж(7zx;@:0_}o}}؏G5ȇW5-|'  !؄BЂ䯐PЇOZ/ߟs Bjn 30p{o~x//eX|s,h „ Nϟ$>HbM.^Òd[g҃3q%Lti&Μ9Câ'РBX J2mS JܔrÿN僠°b z!?aE+E]ʆ.b#݊ttfManasBqS^\hʚ7s * ʴ;1mM0DWcI$mNθbB80LߋOZSHQ-"ya 9?wI0w4#w{0rlE|s1"QJ$ء@J D@ Á .o@(KZ6YS ,Hru4 6\4 >Aw=*(.cC&0vPZ6À;A0 A &5hr$A)Kp.WP''P#A%p4;!"҂?t @rH?paB0؄茎{/BꀐLZ P@PC @BC 68!>9x]T&X?%|B5]\H"R'<$w+t J"rDOi@!vĐB)SO)mDo=6NIpvUWǯZ*0#0C,1c1ǯ1.$D`T`7 97 TȰ3 ,rG7!晘K,G)p R7OL8pM<?cFI׎v+K8OM|p 7pW|qЪ߱&HL"x V$ \DB]EMBO\2A7QGP ]+ HAhB".BGԤ.81P%`c c<z1@@27٭`D"c1b DpĻ9Zh` ZwA MpW1x!QB@R34!Lp/ *X] p>c{"+** 9r %?0 & bC!Hp a?r#(vʫa7TovKHG9d #! (T?RH~!hA`qDtAPa?NsN~2G:S!ɠ;P 2Z1,! $HAVDǞ?Q6"F ,!.(=Dq@9 x̢%# C䥭f=i AArpl{K1JiVmi0J+^1?Ar! ɀЂ?8\P2T.̸C`$B,l7pq .$z趽youuӡ6  ޣP<`CH ."?b$IH ؃ N!2@iOMonד侻MҚ  9I]҉< :9 ^dx'|-/5\PT܃5@пX7(gT0`/BtQQ0( `?2@ q_1Q>J3/chwR#0@ {x<|&Ab5~J|BS@,YA<Ђ`0f  0LQIb h;z>̛}w>P>GX6 " /C+8#C Ct0JBAK@ABwa+́Ĥ h 9?0  뽔lp^>0 .21d fC.9 ɕ `ռL`T@#X Āt!<*A=aZ:p T]ad!Mm!R]?@7B%C08a ! a|ע 5"6 ޟ 8?@C%F!)5'* ( b 6@ |,%?|06CҡA.@ "!x1|dC{[ZCB.H4 lA&XA-B'@ٽ":.L%t#dO $Ad@d h#AC.Au"x*@L$M֤M$NdN CvN/X00N@@-'P+XP)J) Ye(C'P!M B S[@C2LL ^@|B\ 8L<&dFdF&?<dn&gvܱ%h>D \Se[ѥ;@d4fgfT&`f&qNgj(&L?&1@eL @0?TAA`" odefzgWr*g0gLL&{ gq|M@9hi( :A#܂-=@d@C#l=5 bjXHP: A('V-\!9@L@>ِC'&)L- L @Xܗr)i ũe0੟4@e܀$) H*Q6 飺(B+DMhNt꧶"l 0*d ? 0|C ) pp@KHD *NA&VA4B`B7@llA6lB (t??\;)ehî+t@42@,|&H)Ël-exM-GM$x'?lς)*K&n,nFn B(̃Ё+X@#@8t.<&3Ԁ٦*ƒ2^C \(C;+.-lsK/U 4ALC AKL TF2'8n'tm \X"[Āu FdK>8. LC5 TB#h??@6$'` $,B)A`pgS?Dꤢ4@C#p EA5?@(̂͞j1!{/]!/ gRDA0"j/7hB*'3 GP9|8l$L% 1@&Dr1D"]^ Ȁ d,#.ց$C0DCw 3V)+\2^`9pD3~d)d?@m33s,C7B"h VC^D@ (/@ӁË0\:K2GC40??=sD|? J]a?_D@ "a*B45PCCDB,0@김3AkHnLEB58KL " <dC#x]tN? .&4|.uD`<\t;kW5L5YB20=B(03oN\ |.@Ck`3@ C";tWön<+4C P?̃E$4 EЂ+03rbg $ 0(/C\9 H$?T` Dd;(#+LEp?PE4&X?B8|4?u(wx(phQ %5X]@^VA7;|l=#Ls  I&4%"`-0P&4~ԋ[̧|>)(h <=>淂 p>7=B-D5ՂOf3XlS@$*udH#I3bń tfL@fN;yhPCun8!AH 4v{௕-ԴyIJ`4y2ʖn$0₀up`FT?{\N:/g y钲0yl-:pTς%dvlٳi׶^/8vZoÉ78q_+wzI ӣN^.عw<~|zh Pp~ &pA{AϾ- @."qII]TƑLtq$s;|)!;;\I4lJ&2*J2 1\MlR6tk: D8ēF=D?4FAPf43!XAL\ۮŚDl4GL:8KENLDaT8FU=H!|JXu^isUE]bWDaR/c Y}Z*qjݖ:ĕo5/msLulw6 lܥ *#Ҹ}gZr; uAqo\b+^rիzɡ/{Wk6_JIx$K.O/5ee:۫T`wk+ōm%זr,:MiJ?}8KYoSnoۡ˝(%LZRf﷉PH{y~&*r Ke'YU _}Cf~ ' q6. &%UcJ* /jD4wD 1vJtg8Nq; =pR"vbH* cIGtFߤ1'"#$-mat@-zE#[E@rхF_ @чzTc9@F셓!0Qd<6p4PiUR$_#yKGR%mi:6y%LX_2(KnȺc'YKyg( Mo~8YNsh*ODNEGcI!D)ZQ^4S.P!HeԠ'BԀ1LiZӗb`PA)?iJ.RSԧL*ST)uY SwS~U*iUZVc~pyM+Fe Q!uN|` {XĶIbaUrju쳪iK# $1)O gZ\ xpIgf KY * HЁt%@`N̵!pAh84NЃ>1 5|-AGAh0^Pv=e0X? 4C 07 )|+c^? ?lP"] ;6 p.0M#@D'>,Сp1C {F#\clcձGxhpx1xP2+`3&*bb@+,:٪ck\i#H Yt "p/|1<@̸A, L`V?l` KG M ER@Ev&>͆Yz=GTp0#K0G !( *0r q'P#¸=<`$˞G8O {xl $T  M(o䳲u;wA E-% s}ܽ삃 `i)p0,#0AGfІ /Ϋ#H?u4@D (j۹CT W >F#j [E7>Y|_ P< 0D(yr#P <i v-;Acwa*<w?"_B _6mcG7<S DAp`󋁉XnֲA A>#0@! /t~ahĊh{%!h8e˦ 8: `ូ hP"pOfW $I *Y4EZ P'n!z &4 ID& bpD^P Y  P RFd$Q#Q6#;:;?ha"x@CV[1?xa'L41 rQw k>NQ b` gDuC qDJq8Q1=Qa$W1Fıq=QE̠PnVF`b@<0BD^WQER A I!2c!1 FAP'@ c"G"=SD6"D A @ A@'$Pa21&;H@ R#8R:ơ# @\@ f``"%#d%1;\D2"i) T'BA@X`H @@'޲A˄.G.cAb|vB810, ! !6@"' BNA2. S !:2;AS="'/;|A@l`Lala!x`|Ba :S@@@ADAӃAAF p!A¡Xt` JtAhj@ 6&R!@r(qMr>vy~#Hx*JPzrFǴF)59.1ia":`; `$&@20L(%5#Rcr=A>VUrb\!`ASW)Wm44e!HW}#f%lfgCb0n 4AbaVL}"(@ 4 &8N|e %Xꡇa``ꂢ%ֺj6\=L#r d;B X!7GNmb s⌙t'wPtv O$ *!#HBЀT` *&0W2##ЀFPKA|rmy.a:BAT`tx |Hq``DN,{b%ʹu$#@-NP@p. $I4  @A 6ہ!V! ,%# dB! ?` D U6iu|@nBHvց & 8bpVK`<v>Tx aA !@Zހ V~8 ARaZ8|/> `ceGA؎@=v<+wu9;b+` y xAHfAƀ\Y74B!KBCVzE"E!aT~A }x9RŹ$h#*`y!Bhyz@Nrrr}i0A JEbas Ay@츤998E"8` !7pN14x`Z  H@ Ѐ I'2a2vew`:6 KzbE" h\ ɀA ! X ,;*B{$F`J۞2?bCbfaVA & azALU`@T(;$ A€$U >\ A pA4A7a B@0nԁa Xd軍rio:<x*&Qǜ:D\s 3iEV0#]';Q !r ^:a`z':\&:a!g8bAx@ a",؋؏ٓ]ٗٛ],`bAگۙ=aR#{tb L& \uB$?Bր rƀ> C h`>B}½"a  p! `Han2 ,o`n"9` !T@a$ "A_J fAN2×փEa .怞*p ADah~a p@΁vs"cⅡ3q@ t 2 8\ڡR@D aAa( @"[; "`ᛁn!!rX@Va p`A,a7&~Q8x@'-Н ? ax֫տXVd.4FU ;+oFPZ({3Z$_\ڼ3Ν<{ g":I<M_M(Aߍ|[VMޕaMQHvtpD vU x(y5&jew_9|}ڿ uW&Se3n"f=0LE V)ċZt8 .nUUjIRO<@[5)Rni@۸s?‡q6h”-% Ђ8dOd(D3?s),mOkq$"xLOntp3$_.Qt &Ӊ0L| `\c?dR?Lr:\reZD_N)CDL*t/n@O5W!@  a0?<F`, z4u`!ƛo)ƴ▚]S)3x(qL!B?F(L##}L9zViM*-M?Rd?G P"?tAc?[TO.C?xb%tЏ.Ed')M P°i]?*.L -p;hkr>C,O7NDBKO$CP*@ iDq\u,fU/@A-MG>yf:yY":N>d--Aﺿ̞z O<73=C/}xWǎ}{>o~;S~?ӑm`__;p ]ζ u 2΂<`*8 ȍnC]4xt 4gB0^Zh"! }n:/;'AVr["l'-bhŝ4qsZRpuaarW6nɋo2Xǖr{ dh̐xĢ H n>dPb1&`'? Pr% q-[%ΠXr-o\rXŊ %?,1d*s46TAʉpnuܱB0 ps,9ωNsaLk+H (E|s? ~"C֊9C шJtE/P`qTG? ҐBtKPt,m'7t4iEI:.6/6O; ?-*Mq9" A ըJuTUլV`qְud-Yϊִ7R ׸ᓫ]׼u|_ 0-l4j*e]cIBǶM[+bl]4ٿv6G *i ;Ӫv]k=KvmovmbAl  \6i@r \4 㜛^nL5؄M4赉z4PA|[>&66  m2Opv)lHxZ6a|88x, ̀ .NҖ0w[=Ը- j 5fPcn l2Dx 7j*סj*w KP%1 4xp6Bgcs j,D5փaw1\?ym5rw8.rmR$X-a,eS&Wqmew&_qm2f&hmf&r1mbg&z1mg&qmrh'&miO&B1m;PKY͡__PK"8AOEBPS/img/xstrm045.gif-GIF89af???999@@@rrr쫫///000 ___pppooo```PPPOOO***eeeUUU>>>:::|||sssddd!,f@pH,Ȥrl:ШqZجvzxL.sҴzn|Nou~|vsr:W$é:ȷ:ΞՒbae0"&:jqߴx@ C #"'"8`1Ž 01I;OĨJH1 Ul!@ǘx`607˧dR)Q<hpJ t|T+`PꕭZl']BeS6Dcifܖ^!d]~)cUjj%aG:6 kJp94ѠލͅAI଴J> U)Vl5||LDTwZ%˷ +ݿ_9}#@P1(!Zc= a };z%@#8t; kpHozgpXg @EU_YqSj4D4!F{\}]`h^j7> @VF66Q$t!IT#*6&؀r^Q.Q (Rũ\q JEe'R&<:$RiX'd~e{>甕7|Xr%XAN^@i$ l&jl B]hzU\i 5Z]; Z[)26fiOzӒFdTW< bVr)o4Hx6ŒUQWa-4.Yo`D \ܼ xUеRmz).UZYV JXA%Wknjlj.xljas]bX/n-: .6q۳ɜ_HH!:ɱ.f&Mr=mdv4$T޶rg x f]af]ōOqXشjf@7KjG? |-y!XQD}bףXdD9fxy(6t3ݹ'\Z9ni:[<F`D-NP'jU̲AfCY"쉅-&>i].j`0@ h@ C  Ё8had Hc LB}C9@\茿q1W-4` %"6UPP'F7Z@"x$y֧r1-wuDg{w `MDU34~5d4K3LP:PN5PAxE6KMDqߐ3tMEv xeQDSEh\EKb2m_D DdO#FplN lVmUr_up}!+#8x%'x wu!Qsڀ0Çu hX0k(8vL0{Vrъa_`MLlڗj(cK̄wiGSv[U wx@4dhQDPuĄX |O:D tFb`wzyDsyyyGfY$=FrrK4`3Js.gyz`H f8)hjWvvTLG7P|ɷbDz;~CT(χ1Yx!i%#i%VQ~~xP P(G>! d;iw/I)K9M)#OYiQɊQ`hDVЀSD]yu]@qeD H{8 fɂBxeKDL4ЃB `kDnD4Y)swo8c1;Lq9s iu)Xvahb4UfXtHf0 kxJKG]hM@@zJy!򱜉֜@h\@ȹי}ZğOHiQxH} hyF*{Hh Z])km+:?(`fѡ{ Jftʣ{k&HePfȤO&He/!ȥ*%Ghe'ץǦc+a2s}vpYrrtR zYp$xZz)&#ڢgXix D!mtlѬ RTVLǡ"5`l'8,5#8&[AQe.=   ΈAXf1* b# 8FW*Rͽ&mSk@ZՂ 1P|8-3AN~ => > ^FgKI_0fWK ee=Z@BP#_m(Ut}V[[z]DX[ u8s9Dܖ;Ix =pP b?kL5<I}yPWz VHm%.ɩ6]+PlvuɓZm] PNEGGYDFn-Ac2 ( n>^.n(./RԛNOB~^!`K?bU!1ДBz >^^~VdTDS^/됎ա "p>WYEEv̇ _PB? 1r0CT8eda-erDOE^ឰ֘rq 4npr?t_vxqvOgHEPEj~ pw0MvT46ZfO*CTA $p蠉$.zTJHn"砇?>oo Jo+/.ᡁ{+7o>rpag>NmYy_rݐX4It>Q)Q@]S~E.6Nv#uklxt> %w'$t6.Cw,EQST]_ a*f26:u*"48ZNo/YsdjtztΥt tѬ[s92/8D8 Aˆ$0Dh  Ӂ>/Yi梁5#p@Ha$nG H䃦OȀ@+8C<(`r/Ao;M Yg$l J*|ؑh~0b;CN#Oc 4|ABB6¶s徖lJywS8$ ~0c 0M8|4$=BbTVK5cWϤl 5{'" OzBX We&fߢ6P>]`CB)1)4btYhCteBj=Ԅ7~5B*e+#xE?E1 &62Aa&& *8"% ;[%w߲uvzĐ$? /+KPd6,)xx` +niI=dL~ JA9G2w!T[fv"(>6H*}1ʾe":kmZC #bͨ*Y#I #B'lv)lœ#J_H:[,LtG4e@wUK|Ia"݁ۊfþE-h ~9GLIFRbN=@4\ >5|^iOxxIkt(L  rP 0 /* SZf Vݐ, &$oA"p  D,‰,8Ela[܃x.䋰#$"%``uG=}!y7QX#"ǧ1!D, D IIN%1IMf*d!Ilh=m|Л(!!sp+aKYΒD9P4R"Q&/1Le⒗]3a:VfıLmn̄vM7HY<5pOX,OyΓ={ B8irnÔ@e9<6݈. / TUA%tqDQ>h*0*b HWL9)*R?qԥ3H}ʜbC %zAMPꄡR㦢ȩBԹ|4FjW0iT5WZTBkEXAVTU ):զ28kj^¬Lh Wpխm+7\0bƮձ\g1I ,N6 >$Hۄ}_m nmRux#bKFu|-*ۈ"iNm[FnP"nTayWz]t}Gjߨfhۯ^ -TNIabg'Xc`68"aX8k-F JO!5P8cX+~Bb966rCU,N!ôa1/,5)>YoNy7!C % Qd]f!Ӥ3!Λ?m%5_~B"*}(dypȲrFzƐpdUխvCq~t>*O{&C` ܞwotl=& pN9P $Uݶzo p'~S&yʇ{ƉJ7BigP?*AC`ԉ7+`غ̷L WܾP8 C"or/B0P/6:N. lhAƎen@Eү &$ۄRnbn$hN/瘮t@",l T7n @> O=̯ >(GB @ hvp "=ڈ@R< ޶M>mT2@ອZQӌr* /,`ϣ"M0"cR0QK@ƺ"DcGxf$QfRDh+` mj%v^b oU}ѸB0NqA&_6@du"4&-Bc.M$h4 F[B(D` >b9ikR.vH*bg B Q(R̀m Cm t~mgG~6&Q,(f1ĶDDă 1 1$>ư#R .' c*Rq B/'#031s111! &9n F)AMmG^f'IoP2’$۠,)-[`6k9`p7}738(SшF03"3 s"Fm0:d+zb*,Cz@ղm7m=s>>U82y()g3?5/?@7 4Gd3Z2ëf"<"L@< >}"- 637Q11DMDQ73(S ^U" @-/)Cɺ#iʢ"tG`av4Up*0f0E=ײmڒ8qb@LJTh1 S62<4Bc֠J:^r24dE8+M`M_M3Jq Vr ;&xQOUfv. qRNerr<@OT Ul*u.U2?t6:u n0'BUT, "U 2L)W "aRoe@(U5SkCfn5e-m : (/\/T;-VY\j%6UM[^uЕStX'""X <:wZ .XCn '*hb=-asu.M25UG]OSD@P4"JL"2f][/^-2hvhhh6@%^a$$<m@e ; [3 C OA,/v /s8JL}cpt؇yJiN'uCàx s*\UH6e#y.-W86CUhsE,vSCLqQ8zΆJRH⎫l]ɐ߂.l8-Ҷ|5OӞY>ؙmٝy"7gb*'K ,DHD0q `[' ¸4z ^(?RʀYSQ"(#N¥3%)sTc2 6Z0îNkUaҢ 3:y^wK̩u: ˪EQ&Tip7`r)3‘iz} Zk>&A\&geJDa$jB1R-ޓ͈!Ax4>*@,@r?qڻ[4{820(2eu~E|C:"dN2n[ڟm[8(2wM\CDwÏ7)GkH{H0 (r=S;X k{}+F[}FaMpó\ ܟZ,8,*qC?Zӛכ;7;KHB#E*@+USd6GS،ݬm0'z3ÛǏP1Ay !v(\ssI̅ت{LY̷HE q% Lα? ^j6s1t$~f]<}\QĢ>R F*7AXz--| ,{"=&]*.A|u=W~S]V݂Z=^ԢcX[gBsz݌}%iڀ*Ĭ" d}΂}}(}齏b݅#?[ܽթ1ݱh=7kLŋ܉phd\Lhӽ| ^E^<##;mtH"CԹQh t~y瑍z=w-(wU=yZﱰgJkB˅]1K遝JiKgIa=Ko'LǞ3LYLwLwoLEL?M=N=^/H^6)?H@_?ٿ7 ퟇{br!h<"%ӨA)jb-1l>!~2Wźnʧ" .2!BFJ5Z^bfNMrvz)j ;PKL=i--PK"8AOEBPS/img/xstrm508.gif\JGIF89a"LJKCBB\Z[TSSdbc=;;􊈈򭬬厍~||-*+$!"ǂ423КvuuzyyrqqWUVihimlmڮԷꋊYVXkjj浴{zz_]]~~␎(%&xvvonnOMM/--GEF756?=> geftrs˯}{|ifhƧmjk뻺:78˕POO200qooa_`A@@HGGutt+'(# ywx늍砟􍌌ÞZWXQPPsruٳwww!,"GA AT*sBEFC]6сHi83Xr<SHg-T!Ξ)dB1* sH@Kr:)`r *\ˌٳhӪ]˶۷pʝKA*6EᐊH7CPl9c8Cʉ-؂dΉ=;tPWqZ*r.kߖLSag,l= WEQ@CIҧQt= M ||׽?v#s1^'~a8T3@ +݅ACawɅ!v($hr]8Fwx A4b'ōН-<^<Н3<TǒMCwDϔu#YݥѕAteD؉&!p"C9NdyR?#tAaAQӍzv4vt*!] !S èt:)(k*bǢ0g(6ݎ )=9XNWCJC\bCaYAlfNwAtb/)-u-4BAXE 4C X'yRH-ilJdK5DSJ1SJ:!-??4QRLiATMdu3_-Y6P@zVXrWb9dAa6?&fIFZb9ܮ&mU޻ $\KDq-?H7hԐG.hb.PwG=(騧噫MpInVo'|[B,gzk/~莏oܟ~EC$o" @;р-SR -@"ja!ȉ exYщ(L".% ="e|8C&AK-ȀpH*Z㧳B-@/.DA.lA-pzPD q;# 6 &h `bpa gf{Lj)@Q?TC A%7kXCL-?t` :A[pŽ9/Q 9HOŃZhT= qL)Z  0&QF8?,``(8Gz L@O"d< G"ㆄ@ZNJ-0A" - 2QNP@aI~(5(hRx`@ @p&Eδ@R 1KZVIAat4 R@jIa tH4,h>,p`dx#I>؋ړx>8?8=¸I8B.DM؍M88XR#S渎؎Cg8v*xj猪 91pਖ PPkiijP Tƪ Z@ppp XPHA@ g ep yjj [Vv v i"qJZӏjN51>Pb & I `=0@>Ъ < hTN Bj:bizp5{9 [``V;b`Э  0,Q&Vk,yfA J] J` P`;M 95=X 1 Zg2Z9w#h4!+ % NyͪV< /P o"kT"—|,k P 4Pb  AT h ny  {1:MP9@1 @T ` vI@y jtIp j MM{+гj @| 7 p|0%Sl"#w0 KEV)`dDPZ PЃУ`#j٩;3H5 pBYA@%äEp0dJƆ0XPQjܐ Ω\ jN`)cȖyMJk©;B < CIPP@` ;4y9 ; ł\#"nM,<&}@"pE* # ":7,2P|t"7 <9M(RX-"᩠㩕I ݼd*9;M@r&lP#Rջs[סՓ$ zd@l33 'T0` DА" $ٜٚٞ٠ڟxר}S$jISBph rPtp2  Mx4_`L0~@U _ y@ \}-`*=ߙʕ ,p M`h K@4p 7g7A|ѷg ; jE[0p2AL:.9ծa=BP I 4  00 )0 p )ðfqnЪׯ& e0*^Lgst;(B ~I fq [s [ ࢷY?\y50j @ ) Ud v;x=~[$]`cW @0إP &`5͍ύ } 3p ~`k0Q0׌v.𞵃 9 G^ A`:0 gT h  1=C\'Q@@Z >Рw`RA yPl+=m`1 ,p4p ` 1 ʝ gA˺:02 @p? 0eA `\0Si ԯMr;6"> ._|;?R?G9=" h<fղ/+ 0\.upepv@ȟDo OPC?BƯ}6XH\$.dC$jT'4J!pVnI)Ud0"eΤ)sE\tSUOA%ZQI.eSQN*UP(WaŎDnXU4DvnЛ9w mN:&\aĉ/fֈ#DmgСEBk !ëtA6W'OքoTGpɕSsѥO^qnWSry`{ͭϧ_> >QpI7|@Z/tP@!B Ï6 )@d"<K4QAI~Ņ 0 $2|@ @?/dY9LN0+0PƌAA#er ?, 0 w(""i`52E#/B!;tQ I)P@ #K @sX X hc(: ю(ǨtHcHlC Ȩ>0qD`E%I-F0F$HIɽ21ۗLR>+C[)P/|"Yxjs}!WRAB6 dg^tU59s0pjTZիfu] llG?-ltk}]-tC֕uWtkQpul 86Mg/cg?K)A-HB "aR{m)E^t,^B tEN罔%a ,L! g.@;q}C~q" GJY>1y}6xPLx(Yˋr#$>" ;y׽= (tꠥQ ^b @ ]b Ai_?=OԸ"X~Gg{h3'KQhH|Np"ᕣ;~0 tQ^_7>'T}}E~h`;(`BDfC[6*z*Ȯ/!__'D>P L~ujS? a뻃mXjR? ?X @@ඡS@ۃ1@M[S1yAO#A#K{`A4уAt;1b 6BC4滭 *;B9F`hB':32ZP˴ t!ĭ4BCdc(غ5Ը;4PHȂ5@"C!C/d0 >$Cn2h24 4-(/(:4`{GDB;B=t:D?,SūÄIH 8i+p5:?4EY|D:ECMCOFahQ؆sзG|GzƇS+؂EؓX`lmnŗBqlH`_ulQ@bpW( Ȃx}TzIzD(-x6PȂH`GwH  ع=p3B@*&#)u|IIYrK h(H\(@t` J$ʌ<ʤ;tJJJJtII|Dd2ЀZ˼LLl[(@$xD,[9/8F )]5dtKȋKT|ʨʪʬʮl̰4YL|S}NN 0K'82XK-@( TGbp MI,̩P"M5(MQ]Qm}؉Y. Xp^veh{JJ  x2`H(8nϟObx5@rx+P'-^@PePdm΃uxa$X .]>Ő!`hLHc idM*ɚQp Fh ؅D-X҉O.MZ NHH p&HńOPyYS:S4>mSL h' PTG(HAHϴi hc@$H\Oü޴P/( 648N()50+xiN(p>h6GT)0Vd=uVh5(P K`״a -`g '>X0WHO0X8x(n+ #OHH`(5[6X x0 Q2Pl[[MK;P++͚$(@hH;?I0Z׷S,5U-LO/rV/0@  H70E[[h@\] c4؆>XH͚X88#^8Pe =^1RSMPyxuXKڮ۱-[#]P=  ZHЃ0p,^h>)Crhfd?'EOOII 2>! %А/i(Z)F PPP"C]O 2CȠ\F Z^vс\wĹ@qsz$8:ǤXPC:3Ç B5~B <]tه(, $0+ИC>HI#('>Ll!d}lB8' fF,F6p DpL|9 J*hF"`D"`z$<+ hW$!ryvF. /H8A  (7䡀P     @@"; A 0%4Q ,LLt"xd.*aC,`)#&Gtz* 2X ? ]a5[<FFC<ȠK(PnD@Rҁ (&yD 8=$0 <0@ A$PA E%CBK[Jj]@R^ 8Y@xD(2aȎ23ȏ% H@h>`_Ec"S*@ `5;phP"0'?p8 ,ΰX lfG)|m`aݱ{#K c A9e X  Ѐ&d줢$$[ XXAdh/T~%u1 3@lĦl&m֦m&n&m9&D@cbNx= n.'s6nnSE "Ȁ (p9Xij݈t")FN6(hBn $"M"_,JDu^6e{)yV=g)i B n$hX")݌(0L"f)iluB7P7ebfV "A ,X`@7t7B#͖r/ȁ_~i(E v J84B>hn(FJk~U7BZb'd佌9*EBPB6Mr Bījh'xa$hpND1>q,#ıNj74 'Tx(@8l@'FF 5@Ux/RDX帞*\rF?@J$p dA!EĽ*Jɿ~BVBD`*v'QH,dֲ@DB1ATlCA  hC8@X@$0 D<4t<&,ڪmƶ-Dxl-Uh$D4@8Lw$24D@AH#X U,~+EJ*V0D@B+T@J@,xA " % %C&l8BҖlNx( #$(&%..0 @̀ @AĀ&\ @"$-@&@&8#,D8/RTJeXTdA%F+v"pCxApPB¯N֯ J$2tTt =8ȀCAt6x@ |X (\.GOW c V No 2 0#@ HC<%P9#`LBo@ t&.$$ԊLB5<@LpK+#궾%yS@NS̢BX0 \2lA&tHx9,?Bx0\*B$d @5D-`BO`&"81-PB3/hwKsE#C AB$c1$B5HAT@ x ˍMnGN5+{fw9;Р7k;(-;(dK6=DD" :}_YI=PDw}+A͒By6|@h;m<$|dWEk-Ƚ-4= W C"*:~-0$lt 0+(;IЃ$4xaB ²CnVxcFVB(cF |i@A H矮- WR G Cs)] bЂ #6(,XkbSG=PDE:A_ s)qDqb5X@wmH=~FYŋ7vV*؄̪ BHqsh;D"%OT5TGqscƋQrC ]2Tpm^۠yL% V,Y؎'@2d¶o xJA~%SlX pW .#.+d(#dVtIHBp' 3 <X¢&c(/1H` q@Z [&yhf"i"H DPjʭd5 N @xr  0 k*j;>3M"m$-, DG Xnd 7,A@x#,p` 4 @1E$ bE NJOXq!-22ME,LJn!/!P$SHό5I*t SoyHIȐw4aLI"X()  x23;B#P7LZ+1Ђ^H. `၂ (<D4Ǖs#@X8<(N= b-a E֤@!g+8$x(%W%'$#9{hIRkނJА[Gd`@> u9Adh`p$58Jh_襟z yJPÉZ#- i4``j`(&xCld84,i sAxdmp;0 (f|03XB C@4X$^LUb);A t<*d XXc+06(0J #F7CR_6p[e !!B4G؀% $49 !)'/%Vs " D`4Da a H1ă1 *B`,Ld0.Q Fp# ^< f !OyqLi u9  ~DÂЀ tNyh@x@ W5M tp ?kVq!e& 8Et!aA"pMdxDKI4 h +C˝##9b qE `nE":@a2BA"'eB ѨdD0 c::lp#х ]8B8O# b8Є[E&")Hp #Na(+Lal5f#.B[ OGBU#b[2y}^r;OZ c" (:$E |5b QL`(blgY#`lycib)f!& Ah$"N$dL/!X/Ns֬5hn<)` Ī $_PjO&/J~Y$c@.J1\ d C*,!   @Ѐ"dcB` +,@B@@n\a܀D" 0 1 F JI BX A &J` &Ȁ Q>j!k@> *C1h`6'aȂlPdHd!`tA~X@j F $ At`NW @" l,",!&F @ .v@h _r$`x125E -1Jat$%_&cR&g&k&_" , .-6-!@ d ! b !.` A`!6)LPn2&.&5`0`l!( VzfX$E.S>$&$+`3;&$&C4 C4W5[5_6cS6C |RB 4&`a  <@$  ,hd;<E&x ` ( ajx (aBN"R“@ 46@d@#~k2S@'B]66!r 8 jHaPP"Z! l =` HD8ʂ;+G+t</ `2^A>I x1=?3AB@{TKeA/>@B`LMTMהM4M 4%tK;/4Cqs B@-p4 A8`tA'A ,4aN |;S_Gd@ !&X @`>J!S9KP 4YZUZZZ['16~ @L`|\Kta@ d2Z@Rfd1Z__Ɍ!QJ 6 B'`ab@ s;vW`?d /pXX Yuc.VfEccfe6# LRfh)h=t6_g5U`La: ! a j,VƖ|@;`"@ɖn'3idiOVPa: $ꖇ,  `@r >`Ep p $@nH  8rSwmg!>X` !! n1oWuwp X `a Da4!w$27pyb@7 "|u 2]ac ~w}1oasw^ @ W%xy "Xw! 0! b4 4v&A޴ʁCXLvٷ\f`g a ANQn 8.!] U3(6W7cdJ  ¥ ,` |{ !N!z@ BX$Q!sP8_>HA% 0A}n #]  XxwC#O ⊳P"wrCGAkbtK(Ac_#2)huMX}Y20w ? W 9 rr'0L& u aPU(8 !TaD` ԠJ`dA<] a L"EcfyYA`h@ W @e`z ,/V vAVL f$`e8"Y[5 l`  !K5 R@}. 48.@I5>zWDa!X@ f 0]Z^ %@ p&t`ډ)y55 ¡Jg 4p 0x ,az d" m2A =H|K֙Yn \ Z~ aϲ @ |^v ~xA:´)V Ttal`p9a@`|`!  ?{W:A`@x,` DA.:|K6 >AzP n>A 4W{)ZvhZ΁fKǛG|cnKXoyH]џP"h`H/eЛ@@ ĀİB+v33]g֝dX "(Gd"@kٛG9"Ja B  >bD"2aX@"b֣ߟY}7b@A4@ !+H`X!~dt!\"<'@yUEF :&_ȁ b`1@ @Hԉ x@d`,@ S!D~I~1 У4[uA B !T`~UK!M ٛ^ٝ꩞1.A*@ *`>@ ;Ai8aNy!^;}0*FA F_aK PA`X L $ !4?9_D!\AC> 0 LaTL  vA]C>_V+(e:ըfքbn;8aS>?<̛;oDlukM=օ {K(?>ۻG_$BZ]??P'*(@$L` .` Waa'ga;P~b BQbEbF䡈2"-aȍ>BD#RR"LN> eRNIeT8dZP[؋_Iff~gfn RoIgv؝zg~MVYg!߉foNJNVzXniEv*Z wjab Xꬁjk]9ct+\E['Ȋ> LmFn,~ nCK rHA.Bx;P)K3lKGSiKAܳ4?(̰C?"bq:1ր%J'cll)>`o#`̯@nQ\1C〱0ƪ,Pƽ 4J[@PO*ZA14@P@hNqz OO ']V.˔o p2[?l07@ 7L@cqq +r$kr(S~3 ==*=NC-U{?^@ =i=P m$p168n]fXܺG}q3إu s[Hwυ"tJw:},-W\18lu@fvʝvgw ͆gx6K< =`O Y =sO [uM|Jߒ>/#bum@. @إ!2 @sAp #xLjr'? Pr,)OTrl+_ Xr-o\r/ ` s,1d*sl3 hJsԬN;PK\\PK"8AOEBPS/img/xstrm074.gifB@GIF89a岲@@@???쀀򠠠000999rrrϫ ```pppPPPٟ///ooo___OOOggg;;;:::vvvwwwnnn666 XXX888,,,JJJ<<>>λ***VVVyyyuuu˗UUURRRcccTTT444eeeaaa qqq+++hhh~~~555EEEtttFFF)))͂111CCClllʹ...bbbGGGHHH|||MMM\\\}}}]]]mmm---BBB777(((ZZZddd[[[^^^kkk===!, A ,0B = pĊ bpňv9Rƈ z@• Sti@5i)NxPG[TziOC"5JuB=<ĚPլ[~؁^ rE[Y'M;W.D޵Xo\u3TqQI72œ1W|qfϛAw~thӣ#sx]@6mm_瞽XcGǾ?79GryҪE~tv۽wO=>_xwO(h& 6F(VhfAv ($h(a,0(4fAZ5<NDiH(dL6PdTViXZ2 @ ``6X&Ypft  c8H0 ` ~硈&zhcB0l 8e h&1A|:0 p@lJ:̘nJL:_ @J d&*LJ̤vF@ I (|3y#҉.塢|o;9L<@n=@o:/?S @$y-ߵLǺT[Uh$إOA*@Fիy3GHn!&L WX̱04 cHQw@  H &ү Nit%NX .fh^ 1-ԥp|$A4QjB=iNA ?F*G2QLE!'IJZĘpXNUOAȁDp' R#kDh;r ٩ @6&Av(;a MH P׻-D$P2 ԭ7)@ۜ0 rL:vSbV5 $| H>O h! /gT/Zu g/I<L{޴ *.4\ u(> $@QȤ e("`aKh*0ĔHvSϞt,-0P{1G" 0{W6P.MF 0fEWQԹ,*tL҈t 0QiUjzTl{B'f*p۹"&`ʟhRsrZMZ@iMoZ"#.hGCW%ggD$N}ՆJu,n3JTqPӢ꧗mc@\ 멬5IJy|eR-g1lE`/`:6omh8nhxDŽB:FLP-LݲlsdY~oKcߎah ڶ[}V]"wg ujLjpp2u0ްr}Q*i?Z+Q Po2;l`R󳯦e7 _&G Fh\phOW}+$<4FvH>ӘэgvK8u20(rTm0Z)T@3gGq]64GO=]gY~DŽn)eQ52PK+ K~ tc4E @ ( t P7(p!`i1E䲛c?mhjמ% r󄭕fuU23FkjiW9kc)ǪLQ;.)uux2: ">ոu>-':{MEg~KgpR c PgV  t0Đ N*Lj[ؿee@vy;!ڛEki>TN]'*Mc4dMY}$6BkK37;t&4's Tƒ &UMTWe)xVe"(R]"QR L7 0&@pP%|P$P% Ox@%P0 Xnطuۇ uෆc'40$ C&`!A('P$0' 7 %0_H U'}`"`0' cu b'N߇v"sUChE@]R q|2("X}W}($ }qeh'4~pG$@ pH80Q7XȋXdח}"I 2 $04f{ j%Jg  :"R8E ͤ=urW#8 w)1HaׅH#3$SH=emÐVw%!!i TB{YB"H LX7CxN70uQP9#P X;r< h`'4c,iJTHp @2Y ȗ"eYײ*-k=#VZe]E+.U*#VHW0u+mVPeZ4 +XwI9@V &Ր-WUyTÂbLT_cX*`YX"Iy%ÐH $V|hP ՗VpĀ 9x"<>0`0_Ќ 00q)Pv.B7 )Ŕ'4 cev.Gd`"\t` M&!^93cL.% աv^g3x f`7&]rpyB)L1MZM&'LC#B$P[!Y"-Egx25{9 `G EI@CO`MQ;zV+/{ اe%J"RB_!:wĦV:* .#bg/xYxDż{lpUC+e4_ýאoF'5fZP(Bzxh P4 ;{ R;{25# db[@}T7B:J\ĢgsxgI+;L;&t,X_᠁EC?u%,(]Ã`R6XLB8^hu' E_Iȍ\#"u*J8k(,k2LU ;[M{b'*#0u $$0h)  " ٬#l=GA ©`,3Lƛq 'w`' ax 0)`&]\JYϷLXJ<,ePОgʹ$v4JlGGnR qTzNGN #Ӓ $i؎L P+v< \; tgb=d]f}hjlnpr=t]k=IQ6= QPx0B؅P@`=B|79gP@'0 yVMx0 z`z0 W񌮘۲=۴]۶}۸ۺۼ۾ۖ5=YH'V%өѝIԜlI- g po0 5&à? ð m]}߈$ౘ05iPw ~iV> $2[ѪLͳÐWM0'@쎵0 < T0]02>4^4cI",GM[Z0 uPi`k`8 ?` . 0ӆ!\Sn " H[`'$VЭw>Y3`]ND1+E="/;b@~p@J~ ^`0T ,-0|.DB9";!-έ{°{"/* 8;czMͧ%캷¹¬ûү-2D, "$^ȳ춞§º^|/0>E>c!N٣U0 R« N> @E6N? Ip \?Ebr&p8::'@ x#2;02D0XD\^'d_ɮ#.K>opm0 |ROjLWdOb9Joʧ0 +@/0 p꧍._R~?Eo/. e_ð@)S_NO /E'k W򉯳lo~0 @w0 {删OC3¹@R0Ԋ=Mn.n^a`'VPyҪ0  $XA .dC%NXE5n,8̣!! dC7Zѣ 0HqDN"H c^6+VQ 3X &aŎ%[Yi+zRmXqD\D/cάył Q8"$D,i / yujիYXAHE&]ilݢ(dD!r S&M8 &lb,ذŠTVF✦ ѥO^j]ϕ0l7‡/>DPCETaa t0rPY-dx["5_m&LV\E`Ǔꖟyoࡵ||1GK} jbw@%o 1 7u)A;7]O4P*ڌFe@0 *-Lw|s, GC *$t'xna Yhy$: hZAb fQRkՈ7$1t@:PEDQfG@E8Oir;avvq!Fqoc!9%ˎI,6 k$kА7%"p p!y"" A6;MRUE@|C.Xt5Jqk Ydg#Kc"3$gʾh!PV,Jf9.gÏ.:IqS@٢~B A'43bGs-""A#Í@4hI[i hBX:{=`VxTtFDHԤCPoB t%]I6 L3PD%kum1 lUdvh2 Nq XXV9#la {X&Velc Ѥ@1]}={DAL{ZԦVemk]ZVlG/:1acV[ɕ h*mLBؐ@ _:)aƥ(rϋK U! 4M^S1P@ Wr/MZ I  (ЅEu0Lh&6y &@@r g7ÙtuHle'X[f GZ`Etۙym)δZ IG4\ ^G:ҽCtϢImͳn5/pC3s^zʾ:eӮ2MTH<2s:9s=Cim `hQo>^AU_;e?U|7aDt<`֯a֥߭k-Gw!##H'kuV[WWu*6gx/l,wrЀՎӯ)}C+Is3wl``iIy}ђ,w2 4&Cy'3 c)#\@r2@ @@@ AtR#"A=: ;K5AAAYp=c yAA#1?*vaBi@AA.B+@"1-8)1/,1T ^3LZk@[AB9< :\'@(L78CC*Ñ(?ABB4+ CC1+C?DID,KLL'M2ND TKhۡBǚEZ$,;*ZE^2TT(CVE,SA -flGetFjFkՂ`'tb@ģo(9mƃudCwHG`GGvDJ|P }4h\ǂG\GbG8H6 kH\aL+ȱ85naGtܱplzGbIӘI0I@II0ʃxI@ʅJxIIcɃ@83(o4 JiI3>ʁ hƬLD)1Г20Jx(S HLhJptȉ@048KLKH4L X>K3 *ּ4or#70T;KbPK {JTE JFIN͓KbMbK;LO=X+,s8ϳIL0TObP̸ ,LdH΄NNN J>a@|)TI4,I0ˍPx8]Ηte<-d̅,Lń ]5 KIQ,P66K0cQq L;6.M0=QJB Et0PT - J0D4/ݳ֜K8I(x55H J3 0sJ%7 ˞PF$'ląH^l}Tx133SMցM,L5VV J`cf>g3Tne8YR'["U ʑL|P!Gx- zI{T|]W}U;t3e@ˁт-EGeD% }҇ӚSЙX<G  nӍ؇wQ%YWYY Z ʳ'Ւd,MA]˞J{2Ai}˗ )LXPu-a}AA=[M[U[{0}׽\Z>=3M[$T6+N6[ܸ|{UYȍ\ɝ4z۩U0=E N,7o>TO%aI-1=u5ƕ}"˝͒N%ǃ ]DJ=-ՅIG Xe\\-݁], ^,kԞ$R2M5j] `A\O"׸,A 3^XoL_D E,Q-S]U\L˹ߌ׉֐-^V"-r2[~\y=RԀL(LuV`VdUVkݳH]Q>1}ً?=aL ~tW_@b^Z>C:S 8a_\ ],θO &iͣfPiFlׂF&jfXԀV2rvDfθj1=ԔjbskVOET,dkvhZ^^ۅňkmٞmڮm۶<똅\w\F0OMgneYneNȞK[>i]nd,^n\Xڜ2fƶ^W|ooo nfKN7]nWV7{ip3VBBpծo p0aV^qd26jZk6~H r!r"/r#\UUl&8pqr-f>.)g<+OJjmc\:sM&?pas"sX8O >/^?G @ibBhPIN7sGgukPuQGJGEE42g͚%܈);ws; ߧ9iYZC[Y\/ G2i]vf_v:/'[t^1C?`G GbT Cv]ihM wiNwD'{vbG{B_Dxi*uv]6Yp.Qxxb`6zgy?C_'quyy7y?ģI&gzop!z# LKw*'w礟Wóuu{gOO4m?|O|_|O|[h{E/ُ"q||·Jy/}?}wfz{as#G}ٟ}ڇo_&?z R}~~/~?~O~'$߿} ~}@lq~ |^YFZp:[`gߍ$mp{$t!pnp"DN#Zԏ-(`! @ D  p@Q{-#Fڻ/}w;0[0 vg*?&AX9 1^P@kDt!|*1'3fPr:I:3Ѵ|PҢۈ 84tUOz i,"Qm5]b"ȳ@@0vHU6fP4&䵯=?xrI sމWmޯk u Ԉ+~k|xziBӿ`Ÿtǿ fk&8+)(A= 7 sWB(&!(!F<N0~$}:_x3%ĉOT_w3E&z$~WL`u*PlXPf_sF6#nH;"xL0ָ>r!|@F7RztM"H=5I 'JM̡&FDL(xLVyVvL,ECK񖳓JPh!.7A_rn% aJ4AF5C@(bպ0x+8T|`қBߊ^+O>S{~R+_|0_C/ _}_ڣ>Ĥ/Ճ/3KJY~^s \ `D 6҄m_x4^S\]\QxX&^ Zpy` *E`X vI p Ia  !i(LFa#M! )Lv!|\ a[!РnBraB!B!a "B"#>"BD"$N$.b&n!%%V"&^&"'nu"1|'"(b+"))**b*ABbB#Bc.b/*c02c1*$$ #1P5b3&/.c76E zBؘo#:JH;";Q<*D<j="mB?=n?AAdp B*$0C:d$@J$E >bd?&dFrF6d%9BH6bIfdHI$JIvItJzI$LdUd*ޤM$N#;#QcQ<&DRcEv$H~dD:eTBDBdUZU^GSrTzUJeXRVveSeV%VePO*O$PdN[%\eO0dK%]_ N`faj 0B,b4&c&c*d>dF&BLi_=.g*%h~bf9h&i&ic&;ifjjvmlfnlo&mΦm&nnbr*sr6gb< F't:tu @Dl'1t'v^tf'yyj'zj_"g'}N}ާ~*''(&h hD0hʰdDzPX d`@LNrhxh۰`@Ht@0ǜCh(i Bld0 Bd *B 鸍DMJ 8iJ\΃A܈d ό0i$ČX@@@,I x۔ @Ax&>d0JX̍@DŽ6*鐆*,*Ǝji h*K0IJ. LIZ6+$DAk`k$ċ ⍼*$ kkB*1ب̓Z "x+TĶaH}ǀhH+0טJ!zM Τ+B,Hbˎ++Ό2jO&-"-ގ =`K( BmLmNiN-|2ID촏mx&φm0@.&..6.↫V.KpQeqlOtpnOL j.W.O.j.VN /P:5j:;䵴hefLHIwuvjhiUSTommɦ0,-OMNGEF肁LIIKHI_\]\YZMJL/+,b``967SPQ<89ǽQOPZXYDABLJKJGHb_`.*+ZWWTQR@@@ussgee```0-- օ000ppp>;;*()vstPPPؐ뜛Ṹ/,,cbcqpqFCDկπmklpnodab][\ƍѬùxvw:78rpptqrWTUecd{zzé<99̗kijXUUYVW}~qopϢigh# !,^ H*\ȰÇ#JHŋ3jȱGcɓ(Sv†K*cTʜI&A*Wlse΂TIcF1i&&Әa -:f鿪Fҳ׈T`fs&Lp KU8aP2Jdˊ)ifʍ{ d7HBV &<' u7;-LAMBDd G $y8@trGR9Xa 4^2#76d ӂ+a cÛq0 hC옠aw3 .G!]\໎xFp#m$dAnX)o^,ho ]hC'HAfrnGŀL΄a(ZS&%#19o'&eaJRjk V0"Lт``@ P H6 fK)Px\%ryPktV R0g` b+ r(hy})-P֗ʋ]h3+ uy]jD-lӠߚ+82P6!1,JězfL@@iAy9iĿr^TY/-VB抦zspPV;؇H!m"7M6 )lBTN[*ݷS( (Xnź{{.$)k~Puռ~IZ2–dŤP3 iu{ ٞp~ Lfipq'DBy+1h)MRTd'8:x$ނ r],]u IF bXbjab; 0j@jL<йrH.liH!]!F1,(n FvFM,mH?y 70teﱇ(pB&4&-vLa 9&*Sd!Pes4*iJx85eZ:ɳ71xbpfn*H[s4e0r:SWcM!eItU/D>$z:MVOWX:&P88mXap*7[s9t=Ԣ^s1sX!;SKi_xEf<5C6i'1cY)Aq(y1 A7t}(178ȏᎣ!>]V^kx(8-A5-AY:AFs'jAWWW a`&Fb`q]GkWt}QXw).0i2& XP1yw7Bjx(lW@MO0y(if Ywy7M!:|7W1Y{G{u{9?AGܸA9i09}ϗT)?aRyc&ceQqQa t7C~'LJI'DiIeZ<5ؙ1 r9vpop1AaN: MJu|B&*,3GS7V/GHn@$|!XLx)pB "|IRhK$0P;pImm۴1 Qz nu-o3O p{G `f5RVQo  _kG `Epcp{pбq+6/"`p9^[! b[E`Z| [@>/PźIP p ;Z $p:[]|!â p{ мR@ Sjg@z+ !Ģ # Ы Kp J,5k0zz {;{5Y¿37jض}~bçj,`|l>PxJ%~J:g87iJJ-~K72L6 O0  p;-` pI2 eIcӃ.̇%x36ȩ+5|s\Ǐ PP@ ` PȍH< `2@Q ~JGʅBa8dxgտ;ðdzlǶ˺˾ LƌȐL` +c?uxȣLl?#xDZ\KzAnp,tη˻˿\ǜ̌,kXB襡>Jc芭Ȋئ1(]2α,Ǥ`,$` ,< ҩ+zDƨGHZǣYҸlH,M= pQ=$]U}˼,-6U{0 ίԇ P˛PIs@0`` 8p 0 6 +e]טԲ Pp88k3  8[Pj,0r@  p`  ݡ ˰l1:ѯf^;@˶mܞ@  `,ͽT 0 8@ __.;Pp.aj?el=] 6 "O` BE>l׳?Pa0 ` ü3UʾK[,fN^S] ]P`?? >l?7P>o^80 P BqО BCLziIU 0@iƒ~(T"YMI䈏CB0JZYM9u$&AXR M/rK⳦QNj3~YRǟ?i "T!D-bXB,y2ñ"pysfU{dRR+e ,YljAeWۺ3N2N83AlÇ'Vq۸sISP5&P*Wo'\֩_ QU,CXN˚kvS%^uX}yկy3`?ĺ,XXv0žL]*daaP=: LX"kAAUQŘ]ЀP !t*F VFуG @Er̩Q R(Ҫ{01K1A(A2ל7kT ē;P䴏 A#3eP$Љѩd2Lσ6 QӨEOCԯ(U[,TXSm 17H7Tt W{Y)4N%`#0gLZ_i&7Ȩ)30&3]3]uc Øu^"yLj`ԛ ;j#7wb1+x*ӘRpS٠َfπ 3@yKWvGɍid* ;[q3 {77afˬ3|fcܰ3kTl~Œ3+SSNZnx70YUK6iC3Gi"*kbcߚ,8Y6F6 1ȸ ,Ht7s`c _/t 1%~/1&C+&4~2;*_ ?}X ivi ه mY|;T҇/Psة/y_{`.*dwdH&0x1g 4zl%2'BM@g $N6UIx|\vɜdre*qJj ,&K&T.W˚Z0i"L\3`2kLu1ә;$(CQṅJX7MpS$g9 LU HNxSg=yO|擞ň\H*lF%hA zP&T & ʀ2ThE Zt3hG=сb8pRT+eiK]RxCyS-;|Sz.jQzT&UKejSTF5_ԻzUfU[jWU~%rPzVUkek[VUs+ZH{ ^Syla9$7R \&2jbӨ.z6X( Z\4!L&fPX! ex `ɪo hԔQMHBd7MB8%/xa)B(IF&rmMF&l í]Fw)E 4÷VnMt I\Pꗿ-f-! ](RN9<& . lRHL0h `+ SPp,%wop0]7 T@&X4mi``mzPQ MR/8% [!)a,m4 .1f>J4aQhڶGF`2Ha5ѭ w̗)K9H rbL]N{:4)fhXf3mm0ȱH++S [˘̫SD[͔X)k N4%ڛE%Ce˱(iVso[4f.Nkmv;ć?pքkv7Lh(qk.MibkI ?PQV@cC qr9y026KM{uL8|ɼgs]c'{~vC;v]s{>TLz8iwޢ x'~W|ğǤ2|-yg^=y)O'}T^zJVg=5z*VG}E{@½moްyX_/We1k51B ĬC>XB2CRDCQ îwD@D *3\N*OR QV܉T&dYԪ5CXJX$2DTD1^qC8DŬZ8Ex yEEDXE[$F1CQBFf\/H2@MF1cP!GV6(&`S\ǯ“8(;Ge|/a9\Dn\F_|<2v/`DQa},TcD8gĪ*Ǒ,;Ł~ƬJǛؾ0 zlĉ{B5hpōd;}%=lDP:Z*٫E`':īl$ʫE̘BŤ*@Č)Fc*9G:L H͖\LBǴ**2'<$:F|,ȃSJi<K|EJ˜F(HQGK=`z&̃䪈 NKK>K̉{T㪷NP,LR$ ܪ$`ժ 4KN\PjP{$P ߠ Ʃ`6/PM*|*hHCѯ L;sΨ iQ6pҰQPL%1,EL!P1M'|Q*- >5b3-]$&L%IMқ;%mѶTD&T$Q E5:5(L? &K͉JS7aK S>@a >i?S]Q%8LILO]OEL Q՛HUA2PFMX-V N*IeP]UU:d*VTDWFQ5@;`*nf gptTX%Vv;ozWpm{-pāݬkO4U E=>XPWU-GC]|Mݪ؀TԪLX]X|uY5Yq}ׁeZFZ0+:L-ي|ٍ]VDUĻTuZvRLE ӵZu۩MQ۳-S Ӽ1ƱoŕU[dۓ=\)y\4=[w)[`6eʻ%\\݉ ]<\-+0ϩԭCՑe]OMYW]o5ݿڥXeʔ]ܯ(9ZhLޥM`)]נ|{$'(8ŭю5hpb:TDC)ߑ=p׬^ү]^\& Z̪;^71SM !FjW =^/WҬt/8E.-ĉ`7_ի|e CtGDU¤l #6bQ|m I<#^ +CM(h`ݛ^ ƌdUdD @X☂QP@?CJN. M&4:FFRLdJ䚐C)@ )0YY /@)be[JbF\V@VN:_.*.P/P`Nf.qerSx~ xd)g^]fUM.OPqJa SWb.@h/qOJÿldS`i>Fy6i&efdjtyNIFhNVe4QLeF)8gNjR~kp&MfdHK~>襦*dO\h:gJ~l.SFgfn闞/P䱖fJ0p^HkwyF ~sNQƄWgyfPƿ/Y)xec [ eHn|dn/`enV6REefLV+_PHoT ;PK *z*PK"8AOEBPS/img/xstrm075.gifE>GIF89ay岲ـ@@@rrr$$$)))qqqddd ---MMMZZZ...333;;;秧EEEݳѶܴ555===FFFDDDɊ>>>̇jjjiiií666999??? :::sssCCC HHHkkkvvv&&&yyyBBB}}}ppp]]]|||<<<XXXuuuxxx777 ~~~{{{LLLKKKAAAmmmwwwVVV000!!!lll,,,TTThhhYYY444___ OOOJJJPPP111WWW888eeeccc222GGG\\\ zzz///fffSSStttQQQoooNNN'''```RRR"""[[[aaa%%%+++nnnbbb***gggIII(((^^^###UUU!,y$R 4r 00q&E*2h $8$c+tpC9jqy!.⒁C^:e0B9DTY8\MDЂ6;cα(1 Q$nbr'FxbD(Ɔx%ᰭ UCX6W!+bJ7\ڡװc˞M۸sͻBD\"I-8֣@"I-`r#*} iS'O3-H*5)T ZuV^FCYhőcEugvO^\_^@]xZ`9aeqCUXڇ9tb9B(ېDiH&@mD= R@epWJy uUp@Tdf4y>T(grsFY'@ |姞' ^:6opU`VQfrJB]@*-Y-hq/e >JZܯR C>k%[ѠI8䪭/t[됳^ ?`F캔kJ{@+l'02G,1OlgvU,$l(*0,3L8<>-Dm4@4,PG-5LSg]T0DX[\2p[ [ a|W, llcG#~"?w7ࠇ.0l|"26DK[Q 00#4f JZT f* Beb^W&`Z %ZAgzGJ|53"20x؏PUk&tӈ$bS`{lF` NPi@ A瘎 E W ~ P@ 2X[1 twC I Z  hnm6fp 3  =p-` 0%' !"0 OI0P12;ٓIkBwDIi05 w 20fp30 E'p`)d_P"裖0/Pt` g>0y)2{1~1Fi٘Cf p/>@ <8pU@EIcIkY:q 0ei33@&,yvͩY9yٹ9Y%Qjt9 sM 02  0J?ՠlj1ECPP,@։ɝ8?`U)虚Q(*Z,P `4 oOI1`%`gr$?CZx}v}G٤ pV Z `j#JfyizǠ. 7' zʧ >$P A`0 BJHl wJJ: p @:`+p *(:YQ0 UkG0 D6gK`Ыjz` `i` @ @ BMp {W_oʨϊcYY` 04 PF 'Y\;E bsP牚j?0QX` 0iCPW8 1"pXx] ?rDM@İ b@ p` ^@ 003c5˜7k@ 0> p i0 ;uA`ОZQ.K' kp{& EjeK>`I00 1R8a ,PP`> p@BHa0/ˬ4:) g  F v :O 'm݀[Q ŋ3W 6߻+  ڠ` 0` ![6j j76 ,0 3 ,0Y"$3)6۠u¯! kJ  ZHP = U0ªd09Sd [ 5zw p P0`[Ⱥ K 00 MX|F '\i*tJV @=pH; oV pg˽`s e =-ep [@sģǯp Z w , 00g 6R|OLQgs\ xp 0 P>D M<  p0 e ApSK pr= vp=/lɭԔ*` Iadt]ٖ}pŌ|H}Jj؛靎=bJeI=o}۸ۺ[M&(~mԛeIq}؊ͩ];`=p] ne#wBLz 9ڍݮ;ٍtǰQ3mR<Kj=ߌM;a$1+z@րM 0,T{0pڀ 6) VԊz cލ V Ii 0M@=0 rp; Т3۽!~!` ϐD .@ xpG^ pd  d @aEbG 0k NU ` p@-93v 42Zl7Cp  !q0 Fറ: `4@ 3Dp=0Xl];@ ܦ4fdsy- @ x]Ykn q4~pΙ>NN p.V0 RB M@4Ax,Y CY7C~\Չov^J~>Cw=0K}@ gC0"^$^p p Lp``z `࿞kMHwN@@Do. cP V?Gvp0 QS+uQ0M\UP K^A堬5 K A΄;P@- ff,Q>7)8@ Q Y}] My0n8AŁ6rI(^BWE5nGE$)!!I )eΤYM91!OA% YQ=@0H,hp4HAk+'`B BAB%EYr͕-_[awLc!xONz5֮_ÎqJp0`B dbcȹ15{c`0}'xɕ6`LF,ѷTb+Xxq "]BɔJ$T@1o̍' j@ v 3@n43=e7Y " Ͼ+qE[tEHPAJb"P+ /Q0X„ `,R$LJ,r˿d"NIpC0DDcv> .LxKFsPB 5PDE0uQH#K"j&! `%G`# $ &) &V\su hG2Wb$ & UfuV@JeZl":(wk\t)Zw\z[w_k͍8kLcZyou^>7`3N8C2K6d) R柔c䑣byxrY7(3c.2iNJ>ja:kiz KE Nzkje:;FxzB;72Aq ׈Op7Tr;'JhB|&3BB>X@,X8}vg](*Zj?)uc AjFp(n x7H *enoJtDGpF{#ቿh.a[d`> L1qT`D5(C$u]]d~BF<h(AL8` Fw*N30,*' ,@  P[#_VC )Xb2nEꇑUt@/Z8T h8 6@XXQ -1,"X#MXI1$FX7^$sD( 葏~L`#܀=`m"Y%Hɓ\Ҥ?8̊|(H!Cx1`7h ]"2?"LwjDH/c2sh'5Cr| ` VC$Q9E<#/Lx }x,pw jQ]BPn~o5 PcEX XDH >`QmVK-|" ` lӬ)s&M@EozVgP(VŪVA#\PC>Qظ ?[02(xc~B_$eZb@cXDq $ P7(!0?!, B(;?|Hч(4ӥ0 0# ԂPP`n?"HA);3*rxo1He0d!NXEuY*`rs`8` !Ѐ3\5S~7p$H" < =X%pN&Vځ  > /$ SAAR7.ֈ5a AA*QnSڹ0Eɑ+L HXP23 ъ)L As lp DnEa;2uy|hR[*A#!P`xFE`P-UChEଂM$j@:Imڨ!A`U LG%\dvUiC -uEqXdoA'4\?\K< o_0Af5&_Ĥ]H#V(A xk\P?ˤ6O(1!qWF ^{-˩-V"qzჷ T*N&HAv~yuD-l턓؂wL{[X \SE60"]0^ӝB+@W@(A#@`D%FŝENf7|:jl22WEVJV c B F 0+(P n4YQ^0mb fB)< ?2H HSX&p&('R`?  : @0lXDY2"L@G@(8 C[ ^X0rЙ \B@! !H}8;A4)xPJ @2 2h/؄Ns P&, <ÐpB=!yx_X9;p2xH?`&$L XPPPpvX:H4( 2`phEW|EXEYEZE[E\d_P9]; {#$@L`_3g[(`U4 d@-40p@o8OIvlGw|GxL+ E=t X@@Ѐhy8{G3JɂbȄ" ȁDNaI_$`h0' .,֒_^aHa˩Ԋ1ؾW#}%ni,y\`a[گ [{Z-BE0x?(ȁ+3}t]Ӂ& G@b,)] afc`V-gH!sc'X_tb T/@l&)HlBPԐd)d`ܮAc,QPfQ5eEe;xB8=(\ eepEO8@ȂO TiH~nf1h_%f&_n cff0R{02@~Jh8~v6hO&aPVkͽZ2+`3ȗ{;E(+xyq| Illii|t_9bC n&낮nRXӖE Nf~kbFV>jGooQ6Vث%e O{80BDèAtC[pn8&*V0xZ ofoo*.`,:}`gSFX !q߰a"H+XZȇ2 8!DP l0*xMHCԿ(r9r^kΈ8vrT]_`ƦT"!P* / ӧ06`) Ht؅P0+Ё(!؀q :a@hy~P "9H:@QFo'ON2h PS3(RsXc?0vp< @Hs8HuK-`HZ0 0.r`؞?@?dl`vbV,H-+hyE x6V}obqAHV%@L>ywM \LeЃ. pc0x:s(fB;bhaTr\Z p R;0CIan8C<%JaE1pS 3FPO)DD?RQ 3$ؙjx9DTZ?]-` QkNVe{g23͢)mgI#/<85**1M¼1i1sС :jÜju3r#7,҅ %#ZBBc+rc3,{VBhQ+H"efNd1(8#;QD sXċB A 8L<4'rŰiC,WƱF#K "#"(Ls~?3~G7R W|YNcEUojV:g"8qktkf6mnF7Mo|d5X&AHr |- RHNx9p#4n'U2/[^ 1Ij74qdn:_\-|\Drʼn B+zM Nwd | ށ"``Z W[b 0mnu!" bY41rNЏ?䡊e-8X 0Qvp"=*{ ɾjN#^,fNgXB)%6Y p\3QxQ ^D҃14)-A7-H,e?\U?Ħ&DlA$DX @-Bu@+@h d38 ;A5tD⨎F.ܼSJ׽JD+dzGg lB!38C,fH8Cl@nX?4@0P,q1ND%DD<qX*D.DAP7 hD* @A:PG4_vR &Dj-Zpwydlm4!04.-" l0,B(L4C/#xJNBHD  L 8HF6?hK 8oHD(6B60(Z}WC4Wv[x+zjB@ L l /-B@+L">80f@'^A4< | D@&- \?l@@<<0n.'-j53ӂ-Rh&'\1#865nFuO5R!6ą5xhj7?>gS>[~c~G@$>ꧾ>뷾>~|`ԃ~>>?ޝ'/?5?O?W?gk\w?|i>???뀡D4 x3hPNDx`aj@BA `21GE@$B(LL!*/ޘ&65xD9p7H8TΦ@Չê?:ahփ kXg +!!6~uȂ;po_!a ">XaqT Bf !'.l0:(8 ݹ_:y6b -A {d QÉ7~yr˙7wT`aկL=/#M C|,:둏5)+<)2 @ j@ !o)>ؐ]VUd`0`>`#pH$2!n "ƨ! @a< (: p 2; :8<ܓ>NO# 3O#SQ܃O RNLοL]NL LkNLsA n )DBEССbDK;AY;eo9}r)4__;;GDE=9:܃尯;89{zzѡ➞WTUdab~JGHFCDXUUYUVYVW㬫wvwB?@񠟡Ēݝkhimkl!,XH߿ DP >dO"D)f /?dRG#$xReʃ+~H͛8sɳϟ@ Jњ^lpiErlԅW_L+[vHg <ʶ۷pʝK,xz7^} a`,NoN#'#$]eX l,)*u AѬx5Q{k)!BUF]$aF]Y%$:x|dmfαyt]pjnzpt[骷~[&}箻'|'7j ?/N؏f}wޓ䓯EM dQ @CC5at]@?]3@Ei"j @r5g"D-tY`$qBx# 8 O ($?z8C ʯm`ӹ%& (4p$7?@a^< C| ,az j#%:_>(` E(P$ `Zh#wINXr8OG# Wɚ R;㷀QI 6#H8 ΒI+YW"}8$L,`$e>.jo"Pfvf|Ђ<0GP FMԸa*TRTłe%dU2S^J"XM)~tL?VA\3$BIN֘uhMkP&a<"B(; 2N&ntKZu \nDh2Z\z1}xW[ERD/v7;=,XBxMjQ2|*#Mp)]JY/%k]ɉ(tQ$cP:VF2I$$1 @S$h'7F1Eͳt?фJWԍ&Ÿ@-ofN\,BH@ O հ?`Z~X3PD`Y~Ddj@ ѷsiz9h@Bζ3 ,Ή](L[?IlD[rY At[ۣԐ|@(pnӉ-8Mmz'~K~7J(qT59)0m6őeM@wnP %? ?A  xM6/z`P؁[XOqt@}4)qR\ഠzqMهs,9Zzw _An(4#dy|e%ڨZU (  U D~<}-@l@ d ſXA Ne{ R~{m G^m=KKw^.LA О''FH,~pl$C€K\(\ UjE~ $@>P 2CG| xuY'2'y/FyrB"K&4a (h%B)c!"8f v1tT@  sp|0r J p] E AA6!3$b,.re& ,Orx1#D1R@>8XunLzP 04J@9z )`QhTs`W V?\P Aaq P)6Sob,P5⋴R) e.2&!X~lt 3`Fj& Wh(/P(lJ`MXumC `Uh@C)6 4b   b(17,2 "% 4q"\r@-2 :r `. ` 6#ÂwFx4 Ű eivW&]/ @@@9`zEH(t 30g `$8JcY)@L{NJKZJ]qDC% O$)'&: ),(@(1) " 1kz-@"p  >ٍJHNc0@p5,A0 I` vae ~kI! ?66] p bIiEyJ6\I VV@qp Êp t 64Ga>Ҳa"p)06k I11@$D,d btHʳκ?;ja+/0 gt 3 К[ZʭfzQ h[eqOY@P bz~;Gga(BF:]Ik$ ghKK@;` KފP Mw7X:@[X `* Yx/5Y Á뾥bB!HWdk>^+ Bkצ;(I"[D;kPgGk<4p%Į; 0 x~JhN`\qGH} g>u8V'oJN\q$@ţp7Ll@l,j\[\˶|˸˺˶5KEFKou\| h$Ħll~le<\%DܳPq8h pKͨl͈ y kll eMì|$ϲ `Лiy7iG56qEQu8:<>@B==-iuLĬu\g Ѳx!\Q(,P.8\lACA\h鼿|, xR]lPPw|#[= J__o۱$ə|_ׯy|="Z ! i@ns+5A#HVs]P|=kIӌ=!}pڀ4Dm FJM,Yٻ ^,Y- }ZY8͍ڟydIziT(, .ȀfJ>\%J;=#~}&NF`ǯg=Ch}dk 9tA *LGK] p+wX2~== b0挼 Gum gfplI>C (e a* Ew?})M߬ B N_4 a* @ @ ? -\^ gpҢϾ^ =$߳nZV^~>Nұ]dnT@U^L^ o[ N@_eI=[Tк/^p8&OPdp -ȉ TUԀw#)Pds?@H5U/WZ"_)6t>@jm/1=D>0@ױNnx_[]8 3t q 6AqEܸ=ky ?:_͡]km g^ym_"f ̠j Y/_?0 `L> P O$XA rYsš%NXE5nӂ,DRI(\ CxYhD~N6d̠rM9uĈ#;})DaB|XT"˂2,Ft&ZE,V`Jyd Ľ&\I /^A%K0eҴS'O@5T)SPRU+W'~Eb8?e;pĻu/lpoOq˗1gּsgϟA=tiӧQVukWnצK_nN{ D.yye瘣ozhH6/NjЋozpB +m>Ȓ9˞L:Ϊ ;Ѷ+;ԊpBdQNxF°>(k243@n4L mȱ.(Fᾐ)R#"I 0I-3M7+NK#rD<@(c<#I.Wm/ gsS2q%4``m3FUe>3VA==s%c#[a€.^|w_~."PuhFqލ\Lì5NPԈySxc;cQXaeLZ\ +T<Sfsyg{gBΒFY?5A?E4 njkkk{ 66B /E٧ӕeR3@PA#ol s(is^YZwM( |sΉ6,'!pl8ehVwbd4jvs}w{w>\Ћh ]dm\Y;5V"x;B{jLy%h(a:@Px${ġbyS]X;@DUNhE681hI0L2Bp"/Dbp M<% @5HZNQc! TC'>fYpE-\[|@8l(J`KcۄF7QsLxG<юyc,`AR~$d! yHD&R"HYILf=d'z0&Xʺ<*7FWe-,[R.}K@ $f1yLdDd"LhѤ&YM'R59^2ӛ|`8 KrќdNxg9zSga"H&AЂ4%hA?P|DIQX F9т ?Вd?gX'hk 0LcZnT9iIi&_(PBT HR*UO NRbժt)S*Yjֱ&uR)Uֶur=*]՛\P,B ф"v (cC},e#KЂ,A;PK|u>9PK"8AOEBPS/img/xstrm076.gif/@пGIF89ay岲@@@???퀀999rrr񠠠 ```000pppPPPooo///OOO___⫫ggg;;;vvv:::wwwnnnXXX 666888,,,<<<λsssJJJxxxVVV***~~~GGGRRR444FFFyyyUUUuuu)))aaahhhcccttt>>>eee555+++kkkqqqTTTCCC777lllEEEɓ---ȭddd\\\ (((bbb^^^mmmMMM]]]HHHZZZBBB!!![[[ |||...}}}111!,y\P`4X a :TȰC'x1z,b%d2J-,3L&QdfO?q9gQG&hSOFU:̊.E&+ٳhӪ]˶۷pʝK7-E1WdȻGRBUئST![ur51rdϓ5/\YtUҗ;!밮nmٰͻ ,Cbȑgx<'^PrΟcwNu̳w'=睛wn?/H~}  x 2`-d7RUsZa m\p$h(%Y,0(4a5m@)DME&L6PF9בRViXf[R`)dfl馉h)tigP wDS%kY Z%馜vJm@ \@ t>J 1Y c%Z Sk L@A2[ l1B1T`hNb iTphA*[sA)櫯J@L9 o1NہV ǢYkBo B ;[",jll`ZjhB\LAC8  ߪjC0nDOl p3<+6u^dqAL]JM <[ 8qg捚+DzKLz+K4-Q_>Ҧ.:|Ь \Ɖjjӥ۲ע0+նJKAZl*˯̱OtqCV*?:-͋*@^VU ̋!E5|@xzlQ =耆iKRhڶ6I. g'8!lOӞ$@ HL%:PMH*ZQ-S,r`HF6q0#8&pH:kṿ7=o# I1 OԍOd()%򒘔"hv P p (G)J,T#]&WJlR.(! YH.wK^ ZPBL* گLςW Z0@/IjR T &*nbrբj4L 2os|$ܥLcgYBQL(>ɰX%xp@u(ȉjZPFi!Lf*=H\ESa0E'x| hg@Z<Ƴ bTsR280h0 Jj?fnHJʐ pqE, ҁeO: Xc֪X-5}hp׼Ցk4KX]Y@IkCuoy , n0f|o5 -^k+%IK;-o/e-L F,d K k[o B*╯,,xt\ frjYieYAJhs6)`@xl"qxԻ^stxQ A*h"ºfsq P`Ä [ŠPdژ8nZp d`# D.'R@:xγ:K͝-jLhߺ`%h! D'%P!&@l՛8Φ&JI&cKkց ZpA`P)@Jb W@+:`zڷG=KzubY9&wJB]JPba,hiv(!ݩW$r'iEsnw[B@! K0P<@ pC p%l "cl!mWAwǕ( Gխk^<H[ϼ7pg\. 9NV<0qS2ID"@x`5Kn.insl9C=h$4@=7;d-x}oOxM+jݲu\<e O_ ./衆 > 0 xtaWIg8bd#xʅ h1A3|Gpvyny qS4%,z?}Gn&pa`^zP0x!pW ,X @(a'0*g{e7G `rFu7 s *k|H0 vAG |0 $A_)` B#ggA~(P @ 'p#(tV{8!  (p'88xﷃ$$|pG ;j '@ }M({@ s`s@ Zy7mnf4)Dbr} U̦( S0W7l` -R+|ɚɜɞɛ|E~0U o[ 8[ '.ઝ2=@;lTgHd,p|x`O:Pb5&*ڼl9<  h$J\˗pqе'ϯ"H)L9o]M  ]H S "=!-C(#M͋,?d;/D46}e07D;DRF"&7jdH4NNPJ߷DVt2jeWmGYLQ&3hQ@1cGem£OEK!.e5rL}.CoCq"enCvSm4.#C4-,A:v.0UFZJwHD-:s:ײ}5S )u,%@] F=}eNi>k=tߠt,=]#u^p#]RODAf%T4 V[-$@+ A}VVT18TlT)u)ⰳe~6r]E ] ],8UARBR4`}WF)D}ZHj0"cA%]C.)2jLeb;1`Eb=M5_g5BcqŐXUzrhS `WMgX>^["ݏ]1wSvܴB6[B[]14Bj 3W%,؆ .#BtC=bT4`waHcNb/)dom7^\-grX@A4C1_RRww6>c*pd VKJ R(x-_cJN}!Z^R#wcĥ~MD8y7ǂ}N@WtU%73~I:nQ<"^!.7$*S뙄8,@(0 ZR[0^O3Ji5I`9e?E7n/Bu+؄/AL]߉7U Sv,M'σHKWE}02^EH6IrA+cGjOeML^/8U},WF]=>tkUtY;$(fB cC%NP5nG!EI)UdK(M9ubA24pA %$-X,(PACJ\ؠ0 Ϟ8 `[qΥ[D4&\a@0TP; \!5o&gСEVL T0dׄ1Ǧ]϶u} 0Mvq/sG/|K.޽su t{G{ϧK<2=3@90|?(+(<`pCyZ;Li=Bb4 9^dJEqdHF>E[,ؒ;yekVQF^2fg¹/lVziviZ9hmlrv{l6lᡫv;䭍]&)n1jm䙾G+np w'/Vr)P`5+sKC/]"6O0,o7S iv[="y'^߬e wz xzçN{O|%e ̟`T: E]K 4@5}*R?0:#d_ M(Ga\Bİ>3|N wC^G!s|> 1:COsD%F' D@Q[ BAZAZb_EX=3Fà&jL9RQK(,sG1< DCVIcGt"sdRwh<PF#e)ISV1A]+]S^'elyK:M/ED %yL)&31DV3Lh*Q+ft(37fS٦J ;1d ALODؼ\!ɒr!&m_rkЕ1$ZA vPpSd>hI,}gEkO36TB=9,(Mztg+ `Ka MFF)zSv<7 cTd;,0T*E@tFTS-eU'rU5$ =*4>l*ŗFrj%*3(\ZnQ{f]y׭ի5g_;e,JZl;!`ІV%mi?Vemk]'f+9 mmo}ޢmMens̤ɓq˘^0(Zw rbIxo4 >qA,hVƒ2K|`"P/`PqY8|%hJ" FB|z,D 搃qh&0TPd5C< H{.x4\돴,!~H`]@'R&XDVگ|C*~_:7^37U1]3'r-3D|Zz4W[09pG~#>wNZo *g~7\~9Etapj^&?y]m_e/qd3jc@X@g@lŠ>JpGĻݛh'F=N掓7[շ6>_w݄%,2.۸P@,@<@p ?`@ @ @ @@@@9P=k0 '(lA|AAAĶ :n;kA B!B"\@|̦,B'|B(# %& .B/B0 C1C2,C3?@, As)ā9Dh0bDqHĕB@ĿDDET$4#QE*E>TO P SlEREDZ$El\t\E? TB%@DeT=ImTKTL5mSOTPT1U3%U55U75/BVuՇh.P‡U./U/U[u\%_U`bcՆ#da$U0eVpd%jEmUkbVB`Qr5.,qMWtBus]WwmWxW'WxeWy W= Xݜ,XMXݝmX͠XeTPÿȊX/$!M١Y    ؀  Э bŀ ؀b8y؇P - bP X uP@ x  Z- p H0bZ嫉P h[P- ` Z h5 ٹḈ 8-buّu2@ٽ5=u %- Ј0],]] bbƈ\0 M^ % %H[^XmY0YIubP , ]_XM _Ȁ ܋pY  5Y8_]X_h x }X a&] -^u]PvyZ9} X0 c%]!~b}"_*XX"][(~߄b7=a>Me7b8n^Bܜ <=n )Z=ؙ8c  "٣0.`_0 M` &e=bYed[c]ene_/ea.fGec&E=TIS*uf+Ughnfj.b,TTnmp.h%qfmFgnSeTugogpVsugrXQ~nPg hhP6Hefnh^戞fkzNgng}~玎nҸ{h6iFyVoniyv^h 5FV.fhj~hfDe^ꐆinih.&ijh韞iii6ki'N\~keXHfk:nԼfɜaqjlz٠`ڗXڥʏ;=x +ARN\&Y5٦صKZ,H5 u n>vXd.`Inc ֭ l@^ٿ  ȏnb oeo کnՋ% 0[ T] p$q_ZXc6w3+ b`p Z~&͈Wߥۥխl12grܞs2l%ΈM`[esڱPnqCvTY88oD/EO% tFGe +@An2/>= N PZ1 p.֏ x[P_de؝݀tgm@nӼM]ۚ| T. SvI MuY{/ň ^qouUvA#-~ņ,wGםW꫄Ooyw&?Oi4[*r< 䱑c{ulČ'8\y z''76äz crď-w'w{mDˑ@{{ {ШZ L|_| ·.vL0b~|% Mo ң׉|ps )22G3|&j&v?DAw_fZYmSǚ'16K-1~/_$?>ᅮ<@a#<HO,؁.BMkXa!8#Ȑ ( @$ʔ*Wl%̘2gҬi&Μ.('Р@A Nq$")T$i+ذbǒ-k,ڴj׮$ rcBĈQ(!D 9 @a]z! ld1Ȓ'SlۏBlU\ =t6\ 41)[b11'/ӦLwryjQXpCɗAcƳs'KǓ/ӳgN_EwX} @ wZx!j!z!!} xL#t"18#5xcg!W+gAG*$Mnx܁<6V$UHIhYzxX֖v9&iV&e m9' _u'ݹ_}uz@(e(t*z} j)z))3=Z'*vA`MJ_ ++ ;,g9Č0,:,(@nŊӬ:Yd,||&}t1u߶۷2J;龴%!*v[1͋,BNoҴPR pGK Hrܖ I"RXʹhs3[2e;#s|?O)LHZRWFLtP}tFN,KZquDit $A*ttm6v81] l -K^S^v7KVS3m nᅻ:wa+^npA1`L ;uh:.36AT|1p>+_LA$PAKKv}=p {KT>Ms˔?oZĔ8L@SK֩i)`~kQ]@r`1.0- ̐~ 3~縅l=j dB?* $F+P@` RXOwq 'G\8ı+$ AsqŃ5A;{#3i#¤~d#d6٧N擠* &Br,,JpZ\(ˎ8s-asGAvjeoK$Sg/LWE-aDm+&A'0=t΅lb&o9͂T3i$x8 1ϴЉ"1%auĝ8 ,܍>Rbq>]`Bs"& 9\ 1iҝ3]%ڄT1]?2;%P* O( r!:Rt׮3$I$.9_- -0BCjA|Ush$' 2c sjR}^u2;G8 hOpF!R ⧮ )2@\ _f? J bL1Z g™hP)i+*NRo{^K Dx*%n*6!KRAJ`DgB"@ZE.S%ȝ @K% d*5]qblU,{PQ'Մ4E1(0 2u!M|ZhSVsԦ_?i i 9&KC4p4 ABg@$..JfSos 8z d'8!:6-K9Foa@4N{κ)q+8"d!9Mj2.huPE xx u o1o(Q"g `r vM3IRN͆%Ё 4egEGU!T}]7ݖbxY폤"HȫA"3 sLx=o.FjhB+[!): ,#wkעrUnw8s^g*@o,@t4AwIlPw>víJw'ZC^=p {Uv *<3%P@H_ L^Х=WhQi.{z\ 5iG\.[;޽ҸfNMu1(9!GG#Ҝ/SNPb%Mл֨9f^Fp ZGm_|R|I/ eTȄI,r!F!(k.EMEpeHK|SAAFܡXŅꭟ{D` ȈJ@!I iF EG`J K `HA` Hd[qjmGF 簞X<fn!van5Mz`4ax!jZaX`a!ơv&!l` `T Z`At0!$F NaAU\Z%ZV]q ڗa ^ʄ^Z .XJ؉4ɽNFKZحKh/ZM\{ E-EttX\Eg[UF,-X"A DG;r7nVhi!ZYielU.oΖ "] K?F i  +ޙ乄U1ğ!4U\:/Y͚]+U=*ԜqACo| M`JDbLFhPYYOfeAD 0 1HQSVV;Y]ZMB\˜ $hWV%)%112XSLp劋A(D ޲SVIbR{eѣ!ECP\AUgibe`Q] 1aI_mԌֲ0 H4ZiaJDEH\iEa[jZT@ khPlz`RaqjDݞq weeم&qf:EhD\(]\\# C ` R_ <{}'R/yx}ʊ*Eg􅟥"\XhMV@{ehp@]١YEzhVP~C`$`\:.a1~#yl(L1r!CΘcH,Y[D, "J()a2ied@c镦dx&)2)Vq%jHb;R򑛖ʩ!!4jP,pEN*nBfاV NFx**L(jn>jGH**Q&x~f~)[pMh꘴*k*Ak 1+J+PkZ8kM +(kdy+Xic+dڐ C"eYܫL\酲26F&š%l<1Fj+4lSjaG*c$jr*Q'ak,,l~~ Ϣ ВEI :Ж.y*nLԲ]ӶL>+ڧBmFvY Lٶa 擅kޞK߂.-†l @ v gI\. RmBťd !֮..ʁ*J$/`0dn6.wlDN/V^/VKn0@~/JJ$N@//#z/a)Oq:s/g1"1Ok;&}1/ _Gp1qwG,ˎ0Z1 rL11v!2"7"Cn7?2D2/%orJr&s(0&$ÍrKq*rrr,_.( q-q. .[2 rf2133-2(M3(v226/6I<::3;;3<dz< s88  0?=c_>3A?4 tA/jq*#4L4EWE_4FgFo4GwGOG3D4Iï 4JtMJ4DtKo2LSLt#t%4NOrPMQ4OR'/S?5TCG5UNW5V{Ug5W{qQ X tD XuA5Z5AX@DZuGu]u];^^uAX_^`6``۵b6cc'vd/\KveCe[v146_cfk@uiwiDjjv]vkklvmXW0Ov-ovp;pCowrrw4wpCwrrt37u;u[wvGwwO7hwcwx{wywywzw{w1Ts7ws7~۷~ow 6388Ox18wR߳spwDq6vz{w|{xw÷|o7x88x8G78/x7xx #ys@;PK#4@/@PK"8AOEBPS/img/xstrm044.gif+PԯGIF89am.rrrkkk(((<<>>zzz~~~yyy333NNNDDDwww׈ѼmmmBBBpppjjjUUUGGG666...``` FFF簰ĭ lllqqq!!!uuu000PPPŢۻ888ݟWWWbbbLLLsss$$$555&&&|||JJJ{{{EEE+++HHHTTTIII@@@RRRMMM444222\\\YYYʺcccSSS hhh)))nnnfff***777]]]^^^eeeXXXCCCxxx111ooo///ttt___iii:::ZZZ''';;;---ddd%%%###[[[ggg""",,,aaa!,m.H*\ȰÇ#ŋ3jȱǏ CIɓ" ˗0cDHM8s<鯧ϟ@ JѣH*]4PJJFMjʵףP߸Ҫ]˶۷pʝKݻx߿T.+^̸1].HL3k*U͠CѨSsddח_N۸>`֮}k-Xp-N}'F:YÓD īO=}@{3F' S ?x䙇} R֞X60HU2M1F|5S~pD&T!IE!Y!5LOH2SKp%x^z"&9փ8P==?``)T7ptG _~4E%'E\DTs&47E!})@?삍#&!Ë(`H FFL H)BB) n$q!(=8p6( p0muZ?Jpx矁B5h_%s-(VPISP;B9r:EE/ˏ7cgX4$HM=S$J$p91ҫ8DXDH`Ox7OHӊ #?,h&Qh3l@ zN/?8B J|3H`K<*H3DK&a;?tk?JH#h"2ސ?? *:sEFa'! KЂ%֪N(_?h?܀F10"F==HqFP4ssL3rB9CNʜ@?|q8*)vTHݩQ5w\\wH@ NUypd1?(Q{ A}D)N\!?PZ3h!Z;`Gr2΂P܈N<0|FvP 'H!&gaF @AI#ah1h@"vIqL<㙱8W1l*ΡX!-!,@Pg@r0[ȷьGtx)C1X)"@ G=? P77W=~z<}'QYCbЃ j`?!F$qMc.4"@:2B# ?*HH ֋4l)T[8h?Pn⩗RKG{qM]Pܕ0&io@APyl` +` p zIp$ w0 h`4`W 4zJRL7VzPa{"q X a o@ɠ cM@v`xs^bPP 5p q =!K\4? \pP PYEtQTv8Z (PcpH[u@ I $: `0 Xs"X p p  7P [] "o0L4DzUMxP1#:P0EvEbgX'   rW.|*` ,R iP '`oˠ& 0q~qW-I7VǞdᐋ;p@D)Ұ ٟ%Qt I?1Z, * MRx&8wq8Y!0_Ѣ.0>H9i$QM,*B:DZ? uZ]D&ѤPa;㉩#axFJj1 YjɖE1@#VW ;|f(̰ArjjAڥjY) 0 `  ,|" N:ӬPPRɊ;j\ v3i|Pt %0W} ` 0!Ҁ;l p RP 0 p$ jA;8ˣ Kc" s@h@ Ԃ@ 4U zp & W!! GEIkKK2MO;e@ -`?@x ]p060p qm a gl`0 -` =p`M 4` `4H;2k+[)}@3Qp   `   *aJ0E;Qr !O y<` nP נ  P` 4g`qĻ**| 0?r@G p` } @ 0DPA0o@0^ 0 0 p 1 88KM*OQf  :( @i! \0np}PPPXyp},pV!>P&0@4.B@]:ɆRzǡ1 <]v#a Ь$ܟ F j:,!a G@O PZIrU$x-  -" ͞M]!Q}g !ͣ# %M'# a&= .$ O P @,;p?P =@' YBZ . D m0L! HP`x$<8 ! 'X; p3PU ) P@ k{pp 9 oA` 0Q-g  <}=mp?p kKۺ( W `@cAO{`a *Pk ۹ O` 3k,0*@ WB-L0~@拾 P @ |-M@o PP!.ʠC>" :O$ !_/ `mP&^ R m.=j  }GMA&1h \@0 !c< t ` n uM@00@8/ ` ^ Fp@!  UB×c- =yH|0p @EN#q %` Ȃ` uc ڢzp 0m lJ  -Jar0 EOXX;R?TVϊX Xb[_f_h?jizN;tvOxz|XϥO*Ag }*AMgtHk)AgbY)AfX>q:S^ _h>Ex@f߮o0z!I #o3SC%NXE5Rdol$YI,cW1eΤYM9u<2 Q !1cGՍ ~,Hյl[bPCZ )/B@<H4:Z8?_Z0"jG x gbjFFq"ǟd1ǙeoňfkqFŲ<.-{HE G;+K'B*afSJ,LR`LJJ GXB{x&"B j㊈B(rɉBf HZ6`qRJqэC SNPT.=ÜdD!&:`C<# 0Aְ. pG | C D5a D+ i(*H^D(0 d@9|WD lщc'Fo#+:DiA`@kbЁ B?&q fT _A&1qM 5 *` 0@!`E, c!A1O H H!@âh.BC@72 5Ƥ<1*aj@B6"'ưz8OG@= $&F)#")0NQNDЕYD4DZjT,"S}rNHrM8@Q0Lv'Iu2)uO 21[tҴZPTPH=%W}WjxGZ;A>'SD#ℛĻ]D.ShL$ V|-Z̫ӭ'H#y'1icouK$;x*p3}L}j~ioݗ͏!ots %"AA $+>-N<#dp (h@)(B+B#?$;%8tBB.lC7|C7“ؿ0:d';5$C@ DADB,DC(؈.]mH4оNZx[΍RS1u[XH(P_xHvx彞;hXD( zX p%jF`t(@|\GYNHdj?0&hEȇ)_$@_-Ś+1<( p86#] -mxBȆ[HzȆcHuXY]Uqec8%0.pZ E0ETJh&PȁXsCA4/b*F߈bNb@Y؈]p&:0Uh=Vc!h@F"7ФH l^ ({x1RML0FL؃pph6!x`u8"8fJ\aDb6P5B4p7kl&IG_G89 Z^x6d9 ZR0-8cUXfȁ)1ΏĐZHi}#UFh!%R 7@Rpj\)P+ wג_W`(/pJvXgpvvvqs@0Gqv!w'x_ !{?|'}?~ǀO0.rXx'0scx6wsg ,>iaux~Yd! ,`La/D#g=l!<u A:x9衋>:饛~X㏬W!0 (lZV;~_㷃 )* R>!?v fJ?=[=_(P#[` ;{h×KGH.#Bsٙ]>τ0.AeÄ1]'@*Pb1ɜ p\fD061c'@ <,̵1iOb%[1 Q 6)Nsӝ>)P-@u4_nWh P*(A@!H3$wT  #ph\ AcGE]-0kdޅ8HU0BU8^AQ,+H;" )HTT0F} A& P4"8F ,Vla?pQ BCEpH(AP`Fd55 07 #X?@ifY.{#9gA&X5V~)i*cA(0@ TS8#:Vx5H( MчY =ы?0qQ w2P8;*Nd"23CѱXF㤍 Be\\m¬V"Yc ;Jh  C ؂. .(.F }h683LE/>0b*G*bQYXW*2t$_Euq[`H @`@Q T%5U@"uM_Vt2,0 R 9CL\E UV$C|U`%fT= ^aA-U2X@̃&C+48t2@9d&3B |`#t.Cbс*CH?|A- $‘Bh2l $@7<@!U"Rb -')  d-@BX*SԌ)V*"\e@L` A#$̀8\BA4z@u<(C A=%Ul?؀|??>`B%80>*_6?,5dVܐ,#A؁1xR4HSlG9f"&H:IVC@ TD0l 7?ОD AP%AA8%TMX%Vj%WRCE@/A Cø١0v@='3(t^'vfvn'w^'EGG .NcR A5@x@4f:g >C$jf4, D^dA6 of%;#pp?h ?a@w#pS4‰(wH=R}dbgd@DA ?A۝g ( (7fi^B5 @@-DS& t n^)p?XL?d膶=b䘵e?@lBjP$ pLN*V(W'eVӎBYHfB8+@8 DX 8!C (j@'@8;H5N:$%@B> CjX T+@?ipR6 r6P(Џ Ѓ $X6B4+ @R6@!dB'tC2B+FN,V^,fn,v"`Vhj|'r'(A>@dNB':\ \sdE Pň?@>Q@UP 4R).&,a(ب@,,o (\R_k!$jR!x=dym-A,|,q-ؠ?ҰU/4GUAjZ *.0pBFROxTb~ܴ*sE*4,JjejH2h_Tt* /~8-^+jYϘ._Xv.r|.o/1B3f?{4U84J7FD:tE'JJϴbt+yM״MNDôIarPϥ9'=rN2>NǴI3RwU'SnH+P;W0s@/uVCV.TQuO+83ZuD4\O?5V5m Q55a3aN5O\scc4^/qnp2o06Gf7ulWW+QX`F 6j6g6綶Ŷev8pEdTSv__4PVWO6lW6sCsCwVHkSo[67JgvHgvu7ywKT'680mor_PB ),JA+ѽb-,)S0xlm@ @FXr4Iϝ(j!9dD.1$ 勦`Pd]'S^)%MѮFz5Ew9r␩3d)>(@ Oa$Pgr*c%T/~pAl/`FMT9C>إHU٣B2*D3jQF>%=,m7uPAx GjЪB%,Z j@Dpq-KǗ^*t틹*HntN Uꫯ#6Я{0Fn\+ A&.|'(!GW@`jx" )ѓ`@&6]^daѧ9E](„ϑ/re ).F7^lpXkE&?`dBy YC a40:A& 1vš$a;bQd]#dr(ܣ 1:s"FhRsǺϹnvz\'R;N&&<O}[<=O&ң&=PG> }c?я"ß(?P~#L6oYA\02e~KLXBND5Ԥ,guaaH Fs;N&N'ūQ"s&EUO&^];_&>/k'"Go(p"}ԣ)@B"1xD NdGDJRĄ(TD*$xp^ ~fWJSA 0!2"pP!0a2*BQ-8" DI- 4D`) T3A dر5C`(`h8 Y` @pՋ.* 5"`ciІvQ *EPbk.&A&?`@_RBlJtBPOgFM>EeԉD:jH Kx:MB{(J@f{(De7[j%s-~D,4v": 9tuhrg[>.TC׵ -+vwvxҷu|)u]Rnuw 9@':̮e{!nV}`,p`$0cp3,\makpᭀxmƅrYacj7Ưcɸq4Nu<< DF<*Y*LeKrhl\^3 f2go֭昩Yml|8yta|4_h" Z&ndž+yitai70iNeӧ'"i7QXa"HD5@ `&8,`S-FvXWuLn6 Zd␁L.tDJ|eEV[=hO[&s`B&҅,@@dYanOe`p-o`S@)^CIxL$˦8ELUk?0쉀!Q 5<*QyE$|0; ) W.o"jeB nCl@?/ cA2O!:ҙqlKxC=aODTZ"FCx1ė4(# c@Nj{{1xPbi_{ڏ z=m#Xiy"-t0j{"*xPyE#+n:;zOٳL ?(>M>. quAOޠLa".Պf qvX ZBj[`&m6  f x `Ə̏Au(A*tP`P(` 5< (.:f f~Uς@s( lP0C/c N? q2nL@@ no $k/ qL'k" @@.U/XL0dmpQy~@qd@a`k"q{I1nL#..NaqsABL6.ّ)rk)R$Ck V@ o 7=1$KR&H'!," @bo@&1#&w$mRzr~r" V^@h ~8N/Rt*"//r2  xA 8a@-0... /r*0CS4GS2n9m>]>#>g+?3m?U??*@m@=@@M)AmAAA(BmBBB(ClCCCg'DlDwDUDa'ElEqEOEA'FlFKF9F?'GlGEG3G/'HlH6gIJ44K5OJKK@n x@\@ MTMהMMNTNNN!9oiTPP PUN`4A@BR'R+R/S3US7S;S?T)U.oBTOUSUUWSQRYUVgVk5UGJVwW{V]U$V}XX;WSLWYX5XcXZV;PKLiz0P+PPK"8AOEBPS/img/xstrm072.gif#wGIF89ad# 輽ZWWZWX@@@ 0--000usspppTQRLII>;;PPP```???geeϐߟOOO///?; K7n߼ivE1n6 RJʖ.Yr@&/6ᄩ2'3c|LzҢM>ԥSRRu*:Kh6Y*jmݸpSʝw߿ LÈ+^̸ǐ#Kw˘3k̹ϓI ӨS^zP{c˞Mmίͻ[N'CУK< Pذg0~ @?A +>8@ z *VX Xt `vA8X`@A(DpIE)d"9a~t TXX\s>HdL6Y[8%a@(  ZA\WAߩ@,*&)0Yn٥z=>'A :袦(s0`z2^<`1j^zDRPhsx(h dP(˙Y. "vߑ8ˊן kƨ!v!ftFKx գȉB`'ri"⥤Rk#z,`*aj ~+Ӳǃ)&$lÃ~eAf8ݮ03 :1  )) T` W8p^耾:s v0d f4'%wEcՈSn7=.NFN嘷gyw^|Hy.褗nPꍺ밷Kr׎ֶ "_:>8'_7:GDW?:g7x#{ /o'HL:`5 8 @ "Fo7 vPQxE/騐-_b`@ x' 4PCp,SB7l7vPX hN$P3RVĢcEAx3`Z XP 4@GCX4" 0 4pxAϸn|d")dr={f 8 `(\f3#i53)h2Aht&nr\,i0ә$ &KR05CH&"P\X8 jXD,QT N (`+!/H;?^5bG -8 Q2B Cu(q)0I)BD D3F} ȁ'/oښ픠 %E;U_80&B4Qd*U hCDEҢ& fZi Pƭ$Cp:T(O;KR6`!%@jƜIy 02&,Xr ϙΖ BЈNF;ѐ'MJ/ 3iMpQJXaUav 4."OԪ&u ֦# Z4fw_NL5`lMYXnj';;gg&~v lO 3@Snʭ{Av)Wu[0B9߁9-OgB(y".$eエÑ&I/)F(.:(w2 #/Nɓ>}K wP}_C° !C9yuK@Pj|ѣ|@ J \D^ĘԝD "` `0m} {q(Wπ( JȀ)8V% @˛>Mٺ"~J!wao]BS~{;/>X|/2|@\XVاwFAJsv gЉ$pRE@O!&ħ~~ xw v7&0/!@!5o{)}qtu' y"8xǀ`ߗY1W7D6Çy"?x|3`"b+Y[PWX2gz1z @# t'{['g(ہ4熲3~'>s&]0{)P{(7/ @*{8p7@{LJ}ڗy#fpT7Xwp2HЁ6(z،Q|Ҹb;Hd؍dXx0ox蘎oF8=vqa]9Yy )fE;TS1QqX "8I<i)6Ӓ1qVFDe:1 ;>a B,F)L*3J5ȩS: O*2Ť(=5COjC1 ئnGj5YK*Zg>BRNtHɤ _g%DM:i. *^du sz {I[:_d^| fJFjFP*6ѩ0, ^5*5T*.Ej;JwPgd+I4Қ˪.Z;Y*xZ/L/﹭4*SQi BJSjJQ2PQaQ!@%5Gs%eH- SOhĖ)Ys4R[Y, C$$ &"+S UjYR__I0UW I"`V\PuM'DUCPEIS_"I5&ɵ%Ss^ET_eN?IW/ RbD[eIF@ZBt-pYQ5Z^EJ\E4\EJ@MqT[UZ~\DAeY^'zBqL5t[D05 &;AkѬSX@_ĒWQE4G3MP~WJS DQ%JkF>GQPkIjKCѼQ<Ѭ JF{BƽdPW+{F RbUDeFb$T57ZйPmĢۣMjڴREjLiIԪd[%fX|.,J&J‹Rńg4+XA{F$4\,8zәDtD>pXPM?MYUX$^J[\4t\5zTU;IcQT\j GS$Y>DGM9-F]F H QkK[CpFg\LHL$|PdM,ςԳ oT\HJq NJQǻէu`yD˹"yqҒJ [[@:Lql\$^,uDO^﹝5J0xӍqaÄ4,PDXȴIK.jd@pFӳ*h=UJTZDQf%   >Dւ կs˃0H QI)Y\kk)B( 2:m1q?~QګC+NR:Aۧێ:m՟a~ĝ嗁CO34I*N#(v^ӱs:|~ ,Sy05!b)~h#5C.%EBQn鰃sؘ2O< 2ݧ,(믎^/6Gxw.:WCy"&Ry:Xj.郀"(9,.N͋*W) q> 9̝: 2޶KDMt ^q!+nXp񷁱gSy{)n8o[sHn&iP"4 3us$q&|2$]"'7>nI5I_K2Ȋr#7"tRu%=Ãb#H%k-XrO9nTqRB-R؃]s qvwV $_ݾT:'{s&p26j挿߄g.O?9﴾CgvKw14hP[WH0"붞ܷ?4:  "XX)) )X     X XăX 0X((X0X ()) " !|o^\"JHֱd˜ Qڴ e-IO\Ib,}IHn5s>ԥO^2k&Q7]J+e-J̩bVNiq찪HxUd] +.0v] ߿ La'˒.@%H D ϠCM4i)$!t1^bؖA۸s;wk<~=,[ڽ+_μp%.̸YͳkURbT_Ͼ˟O}c+yK~/Q 6H`=Us`4Ix "(kPaPV -D/nX5-jɖ##ÏSmHdE;ɋ2G eDI2Ye5NФS$eTi&G9Wpj$f-dr1D4}'1ogN)#{gY^B2ډlNJ%̋<@*thF*N@* -x}jaSPiJ,;Kl=*+8S Kwn WX+r8.ј;+.ɸ +>8/Kś o!p/ \#m .q0[lKȓ|&2Ю%-r\@-Dm .;߲ĪPG-TWmXgQ#Q d ,6nmH/wX~s<0߄'^#&GKgsys8i.騏7>kٮ X6Zc1||SxC|-Sϻc?=-sك?;O;X?~-+_ďjo+_?0}+8M #؈ { i f0o35!!U(B~(T Sְ0|!3b|->|`6D dBޔX$ OHD*QQl'Qp",4̡ (:w2lL#(Gя}8)b C.Td!IBҒl$%7F%H e>I QztA-dU*aF 2,mYA2e/K,fLf&ԝ L)MjbѼ5iPV3f#9ms9fNo<:M4> '@Zm'BZP2 D'zR,(F7E@pp\T JgZa )1dJӞւa0@A#J:Tp*"T0 05DKU A2 b>(:` : ZpkO:Sau@\b8YRm0` Ѫðw5>Yrb HRYC?<:Fw=T [DmUqӭE*`T}Qb]2,NR^`_ˋ)-*[T/}jZ5H+0C ؽeov@E^v|4 vX vov0E`jV6սsRQqeL7ҿ`CRV2Der(1Xfo|2y[H8L:xsH>izpBЈN=hj(F[HiۄdierN[:@n^ XzbbrY3ֽ.S3[ؿ.q,[pGOꊶi[:pϭR^]x{冷={w0haA o1@9@@ 0c(^ G<f,`A7>c%A Qs<E@ v 1E PF<3w PX};G t$яn"굈:~T ^`AaP :k?n-~Ea@7| j u}Q~  /8=@p|_rя) 2nu~㉯zi ?"˞^ D:kpԀ/Ot;{o>cD~/Y==Q_ `*0xWt[Qj472Gև}W678'1`9rA7t/`:s/s@~HfWw r[uY7Q'|u4`?u#gu9@|Zu>p *>Qj+0s"t.{,90Q79"W>0xPtgwiwsLvWGr08y"z\q qPguwh7uoxq\wu8qGukg0WG{JȈȂіqq tX`ZXq3u"7fzhk(xö't2xu5u7X;v`'"GFW p85lPs]WCx8Gr!x~4t771Hh(h~G{ЍRXQWW y%~y7呤X1qvA9Yr1$ّ&ao. 0i292"ْ8Y5Y7ٓ_B) :y Description of the illustration xstrm076.eps

The illustration shows two Oracle databases. In one Oracle database, the redo log records changes to database objects. The changes are captured by a capture process and enqueued as LCRs into a queue. The LCRs are propagated to a queue in the other database. In the other database, an outbound server dequeues the LCRs from the queue, and a client application receives the LCRs.

PK. PK"8AOEBPS/img_text/xstrm070.htm Description of the illustration xstrm070.eps

The illustration shows an external data source sending data changes to an Oracle Database with XStream In.

PKE`-PK"8AOEBPS/img_text/xstrm075.htm] Description of the illustration xstrm075.eps

The illustration shows an Oracle database. The redo log records changes to database objects. The changes are captured by a capture process and enqueued as LCRs into a queue. An outbound server dequeues the LCRs from the queue, and a client application receives the LCRs.

PK_ΧPK"8AOEBPS/img_text/xstrm508.htm\ Description of the illustration xstrm508.eps

This illustration shows changes made to database objects in an Oracle database recorded in the redo log. A capture process formats these changes into messages called LCRs and enqueues them. An outbound server dequeues the LCRs and the client application receives them. The client application sends the LCRs to the inbound server in a different Oracle database. The inbound server sends the processed low position back to the client application, and the client application sets the processed low position on the outbound server.

PK֊PK"8AOEBPS/img_text/xstrm074.htm9 Description of the illustration xstrm074.eps

This illustration shows a sample XStream Out configuration that can be configured using the CREATE_OUTBOUND procedure. The illustration shows a client application and an Oracle database. The Oracle database includes the following components:

  • A redo log that records the changes for the hr schema, the oe.orders table, and the oe.order_items table

  • A capture process that captures DML and DDL changes to the hr schema, the oe.orders table, and the oe.order_items table. The capture process converts the changes to logical change records (LCRs) and enqueues the LCRs.

  • A queue that stores the LCRs that were captured by the capture process

  • An outbound server named xout that dequeues LCRs from the queue. The client application receives the dequeued LCRs.

PKXr>9PK"8AOEBPS/img_text/xstrm078.htmt Description of the illustration xstrm078.eps

The illustration shows three Oracle databases. In one Oracle database, the redo log records changes to database objects. The redo data is sent to the second Oracle database. At the second Oracle database, the changes are captured by a capture process from the source redo data and enqueued as LCRs into a queue. The LCRs are propagated to a queue in the third Oracle database. In the third Oracle database, an outbound server dequeues the LCRs from the queue, and a client application receives the LCRs.

PKjPK"8AOEBPS/img_text/xstrm012.htmi Description of the illustration xstrm012.eps

This illustration shows users making changes to database objects in an Oracle database. The changes are logged in the redo log. A capture process formats these changes into messages called LCRs and enqueues them. The queue can contain LCRs and user messages.

PK^kMPK"8AOEBPS/img_text/xstrm077.htm* Description of the illustration xstrm077.eps

The illustration shows two Oracle databases. In one Oracle database, the redo log records changes to database objects. The redo data is sent to the second Oracle database. At the second Oracle database, the changes are captured by a capture process from the source redo data and enqueued as LCRs into a queue. An outbound server dequeues the LCRs from the queue, and a client application receives the LCRs.

PK1ph&/*PK"8AOEBPS/img_text/xstrm069.htm Description of the illustration xstrm069.eps

The illustration shows an Oracle Database with XStream Out sending data changes to an external data source.

PK!PK"8AOEBPS/img_text/xstrm045.htmB Description of the illustration xstrm045.eps

This is described in the subsequent text.

PKGPK"8AOEBPS/img_text/xstrm064.htm' Description of the illustration xstrm064.eps

This illustration shows an external data source sending changes to a client application using the XStream In interface. The client application connects to the inbound server and sends events to the inbound server. The inbound server applies changes to database objects and sends an acknowledgement to the client application.

PKRPK"8AOEBPS/img_text/xstrm044.htmB Description of the illustration xstrm044.eps

This is described in the subsequent text.

PKPK"8AOEBPS/img_text/xstrm071.htmz Description of the illustration xstrm071.eps

This illustration shows a sample XStream Out configuration that can be configured using the ADD_OUTBOUND procedure. The illustration shows a client application and the following three Oracle databases:

  • The source database contains a redo log that records the changes for the hr schema, the oe.orders table, and the oe.order_items table.

  • The capture database can be the source database, the outbound server database, or a third database. The capture database contains the following components:

    • A capture process capturing changes from the redo log of the source database. If the capture database and the source database are the same, then a local capture process captures changes in the redo log at the source database. If the capture database is the destination database or a third database, then the source database redo log is shipped to the capture database, and a downstream capture process captures changes in this redo log.

    • The capture process converts the changes to logical change records (LCRs) and enqueues the LCRs.

    • If the capture database and the outbound server database are different databases, then a propagation propagates the LCRs to a queue at the outbound server database. If the capture database and outbound server database are the same, then the propagation is not needed.

  • The outbound server database contains the following:

    • The queue that contains LCRs that were captured by the capture process.

    • An outbound server named xout that dequeues LCRs from the queue. The client application receives the dequeued LCRs.

PK\ozPK"8AOEBPS/img_text/xstrm073.htmY Description of the illustration xstrm073.eps

This illustration shows a sample XStream Out configuration with two outbound servers. The illustration shows two client applications and an Oracle database. The Oracle database includes the following components:

  • A redo log that records the changes for the hr schema, the oe.orders table, and the oe.order_items table

  • A capture process that captures DML and DDL changes to the hr schema, the oe.orders table, and the oe.order_items table. The capture process converts the changes to logical change records (LCRs) and enqueues the LCRs.

  • A queue that stores the LCRs that were captured by the capture process

  • An outbound server named xout that dequeues LCRs from the queue. One client application receives the dequeued LCRs.

  • An outbound server named xout2 that dequeues LCRs from the queue. A second client application receives the dequeued LCRs.

PK%ЫPK"8AOEBPS/img_text/xstrm072.html Description of the illustration xstrm072.eps

The illustration shows a client application sending LCRs to an inbound server named xin in an Oracle database. The inbound server applies changes to database objects and sends error transactions to the xstrmadmin.xin_queue queue.

PKqPK"8AOEBPS/img_text/xstrm063.htmp Description of the illustration xstrm063.eps

This illustration shows users making changes to database objects in an Oracle database. The changes are logged in the redo log. A capture process formats these changes into messages called LCRs and enqueues them. An outbound server dequeues the LCRs when a client application using the XStream Out interface connects to the outbound server. The outbound server sends events to the client application, and the client application sends an acknowledgement to the outbound server.

PKQupPK"8AOEBPS/xstrm_intro.htm=5 Introduction to XStream

1 Introduction to XStream

This chapter introduces you to XStream, a new feature in Oracle Database 11g Release 2 (11.2). XStream enables information sharing with outstanding performance and usability.

This chapter contains the following topics:

About XStream

XStream consists of Oracle Database components and application programming interfaces (APIs) that enable client applications to receive data changes from an Oracle database and send data changes to an Oracle database. These data changes can be shared between Oracle databases and other systems. The other systems include non-Oracle databases, non-RDBMS Oracle products, file systems, third party software applications, and so on. A client application is designed by the user for specific purposes and use cases.

XStream consists of two major features: XStream Out and XStream In. XStream Out provides Oracle Database components and APIs that enable you to share data changes made to an Oracle database with other systems.

XStream In provides Oracle Database components and APIs that enable you to share data changes made to other systems with an Oracle database.

XStream is built on the infrastructure of Oracle Streams. Therefore, XStream inherits the flexibility and functionality of Oracle Streams, including:

  • The logical change record (LCR) format for streaming database changes

    An LCR is a message with a specific format that describes a database change. If the change was a data manipulation language (DML) operation, then a row LCR encapsulates each row change resulting from the DML operation. One DML operation might result in multiple row changes, and so one DML operation might result in multiple row LCRs. If the change was a data definition language (DDL) operation, then a single DDL LCR encapsulates the DDL change.

  • Filtering of database changes at the database level, schema level, table level, and row/column level

  • Rules and rule sets that control behavior, including inclusion and exclusion rules

  • Rule-based transformations that modify captured data changes

  • Support for the data types supported by Oracle Streams, including LOBs, LONG, LONG RAW, and XMLType

  • Customized configurations, including multiple inbound streams to a single database instance, multiple outbound streams from a single database instance, multiple outbound streams from a single capture process, and so on

  • Full-featured apply for XStream In, including apply parallelism for optimal performance, SQL generation, conflict detection and resolution, error handling, and customized apply with apply handlers


Note:

When learning about and using XStream, a general knowledge of Oracle Streams concepts is helpful. See the following documents for conceptual information about Oracle Streams:

Purpose of XStream

By using XStream, you can accomplish the following goals:

  • Replicate data changes

    Replication is generally used to improve availability and to improve performance by spreading the network load over multiple regions and servers. XStream enables you replicate data changes made to an Oracle database with other Oracle databases and with non-Oracle data sources.

  • Store data changes in files

    Some environments use files to store data changes for various reasons. For example, an environment might use files to store data changes if the environment does not have a physical network, if the environment uses disconnected computing, or if the environment uses satellite communications. After data changes are stored in files, the changes can be processed in any customized way by applications.

  • Share data changes with a client-side memory cache

    Some environments share data changes with a client-side memory cache to improve performance.

Prerequisites for XStream

Using the XStream APIs requires purchasing a license for the Oracle GoldenGate product. See the documentation for the Oracle GoldenGate product for more information:

http://download.oracle.com/docs/cd/E15881_01/index.htm

In addition, this document assumes that you have the following skills:

Tasks and Tools for XStream

This section describes the common tasks you perform for XStream and the tools to use to complete the tasks.

This section contains the following topics:

XStream Tasks

The common tasks for XStream are the following:

  • Configure XStream

    Configuring XStream involves preparing an Oracle Database for XStream, creating the Oracle Database components used by XStream, and creating one or more client applications that communicate with the Oracle Database.

    See Chapter 4, "Configuring XStream" for information about this task.

  • Administer XStream

    Administering XStream involves managing the Oracle Database components used by XStream. It also involves managing the rules and rule sets used by these components. It might also require modifications to a client application.

    See Chapter 5, "Managing XStream" for information about this task.

  • Monitor XStream

    Monitoring XStream involves viewing Oracle Enterprise Manager pages related to XStream and querying data dictionary views related to XStream.

    See the Oracle Enterprise Manager online help and Chapter 6, "Monitoring XStream" for information about this task.

XStream Tools

Use the following tools to complete the tasks for XStream:

PK?==PK"8AOEBPS/xstrm_pt_admin.htm4 XStream Administration

Part II

XStream Administration

This part describes XStream administration. This part contains the following chapters:

PKQ PK"8AOEBPS/xstrm_man.htm Managing XStream

5 Managing XStream

This chapter provides instructions for managing XStream.

This chapter contains these topics:

About Managing XStream

This chapter describes managing an XStream Out configuration and an XStream In configuration. This chapter provides instructions for modifying the database components that are part of an XStream configuration, such as outbound severs, inbound servers, capture processes, and rules.

The main interface for managing XStream database components is PL/SQL. Specifically, use the following Oracle supplied PL/SQL packages to manage XStream:

  • DBMS_XSTREAM_ADM

    The DBMS_XSTREAM_ADM package is the main package for managing XStream. This package includes subprograms that enable you to configure, modify, or drop outbound servers and inbound servers.

    See Chapter 8, "DBMS_XSTREAM_ADM" for detailed information about this package.

  • DBMS_XSTREAM_AUTH

    The DBMS_XSTREAM_AUTH package enables you to configure and modify XStream administrators.

    See Chapter 9, "DBMS_XSTREAM_AUTH" for detailed information about this package.

  • DBMS_APPLY_ADM

    The DBMS_APPLY_ADM package enables you modify outbound servers and inbound servers.

    See Oracle Database PL/SQL Packages and Types Reference for detailed information about this package.

  • DBMS_CAPTURE_ADM

    The DBMS_CAPTURE_ADM package enables you configure and modify capture processes.

    See Oracle Database PL/SQL Packages and Types Reference for detailed information about this package.

  • DBMS_STREAMS_ADM

    The DBMS_STREAMS_ADM package enables you modify the rules used by capture processes, outbound servers, and inbound servers.

    See Oracle Database PL/SQL Packages and Types Reference for detailed information about this package.

Managing XStream Out

This section describes managing an XStream Out configuration.

This section contains these topics:


Note:

With XStream Out, an Oracle Streams apply process functions as an outbound server. Therefore, you can use the instructions for managing an apply process to manage an outbound server. See Oracle Database 2 Day + Data Replication and Integration Guide and Oracle Streams Concepts and Administration.

Checking Whether the DBMS_XSTREAM_ADM Package Can Manage a Capture Process

In some XStream Out configurations, you can use the DBMS_XSTREAM_ADM package to manage the capture process that captures changes for an outbound server. However, other configurations require that you use the DBMS_CAPTURE_ADM package or the DBMS_STREAMS_ADM package to manage the capture process.

Specifically, the DBMS_XSTREAM_ADM package can manage an outbound server's capture process in the following ways:

  • Add rules to and remove rules from the capture process's rule sets

  • Change the capture user for the capture process

  • Drop the capture process

The DBMS_XSTREAM_ADM package can manage an outbound server's capture process in either of the following cases:

  • The capture process was created by the CREATE_OUTBOUND procedure in the DBMS_XSTREAM_ADM package.

  • The queue used by the capture process was created by the CREATE_OUTBOUND procedure.

To check whether an outbound server's capture process can be managed by the DBMS_XSTREAM_ADM package: 

  1. Connect to the outbound server database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the following query:

    COLUMN SERVER_NAME HEADING 'Outbound Server Name' FORMAT A30
    COLUMN CAPTURE_NAME HEADING 'Capture Process Name' FORMAT A30
    
    SELECT SERVER_NAME, 
           CAPTURE_NAME
      FROM DBA_XSTREAM_OUTBOUND;
    

    Your output looks similar to the following:

    Outbound Server Name           Capture Process Name
    ------------------------------ ------------------------------
    XOUT                           CAP$_XOUT_4
    

    If the Capture Process Name for an outbound server is non-NULL, then the DBMS_XSTREAM_ADM package can manage the capture process. In this case, you can also manage the capture process using the DBMS_CAPTURE_ADM package or the DBMS_STREAMS_ADM package. However, it is usually better to manage the capture process for an outbound server using the DBMS_XSTREAM_ADM package when it is possible.

    If the Capture Process Name for an outbound server is NULL, then the DBMS_XSTREAM_ADM package cannot manage the capture process. In this case, you must manage the capture process using the DBMS_CAPTURE_ADM package or the DBMS_STREAMS_ADM package.


See Also:


Managing Rules for an XStream Out Configuration

This section describes managing rules for an XStream Out configuration. Rules control which database changes are streamed to the outbound server and which database changes the outbound server streams to the client application.

This section contains these topics:

Adding Rules to an XStream Out Configuration

This section describes adding schema rules, table rules, and subset rules to an XStream Out configuration.

This section contains these topics:

Adding Schema Rules and Table Rules to an XStream Out Configuration

This section describes adding schema rules and table rules to an XStream Out configuration using the ALTER_OUTBOUND procedure in the DBMS_XSTREAM_ADM package. The ALTER_OUTBOUND procedure adds rules for both data manipulation language (DML) and data definition language (DDL) changes.

When you follow the instructions in this section, the ALTER_OUTBOUND procedure always adds rules for the specified schemas and tables to one of the outbound server's rule sets. If the DBMS_XSTREAM_ADM package can manage the outbound server's capture process, then the ALTER_OUTBOUND procedure also adds rules for the specified schemas and tables to one of the rule sets used by this capture process.

To determine whether the DBMS_XSTREAM_ADM package can manage the outbound server's capture process, see "Checking Whether the DBMS_XSTREAM_ADM Package Can Manage a Capture Process". If the DBMS_XSTREAM_ADM package cannot manage the outbound server's capture process, then the ALTER_OUTBOUND procedure adds rules to the outbound server's rule set only. In this case, if rules for same schemas and tables should be added to the capture process's rule set as well, then see Oracle Streams Concepts and Administration for instructions about adding them.

In addition, if the capture process is running on a different database than the outbound server, then add schema and table rules to the propagation that sends logical change records (LCRs) to the outbound server's database. See Oracle Streams Concepts and Administration for instructions.

To add schema rules and table rules to an XStream Out configuration: 

  1. Connect to the outbound server database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the ALTER_OUTBOUND procedure, and specify the following parameters:

    • server_name - Specify the name of the outbound server.

    • table_names - Specify the tables for which to add rules, or specify NULL to add no table rules.

    • schema_name - Specify the schemas for which to add rules, or specify NULL to add no schema rules.

    • add - Specify TRUE so that the rules are added. (Rules are removed if you specify FALSE.)

    • inclusion_rule - Specify TRUE to add rules to the positive rule set of the outbound server, or specify FALSE to add rules to the negative rule set of the outbound server. If the DBMS_XSTREAM_ADM package can manage the outbound server's capture process, then rules are also added to this capture process's rule set.

The following examples add rules to the configuration of an outbound server named xout.

Example 5-1 Adding Rules for the hr Schema, oe.orders Table, and oe.order_items Table to the Positive Rule Set

BEGIN
  DBMS_XSTREAM_ADM.ALTER_OUTBOUND(
    server_name    => 'xout',
    table_names    => 'oe.orders, oe.order_items',
    schema_names   => 'hr',
    add            => TRUE,
    inclusion_rule => TRUE);
END;
/

Example 5-2 Adding Rules for the hr Schema to the Negative Rule Set

BEGIN
  DBMS_XSTREAM_ADM.ALTER_OUTBOUND(
    server_name    => 'xout',
    table_names    => NULL,
    schema_names   => 'hr',
    add            => TRUE,
    inclusion_rule => FALSE);
END;
/
Adding Subset Rules to an Outbound Server's Positive Rule Set

This section describes adding subset rules to an outbound server's positive rule set using the ADD_SUBSET_OUTBOUND_RULES procedure in the DBMS_XSTREAM_ADM package. The ADD_SUBSET_OUTBOUND_RULES procedure only adds rules for DML changes to an outbound server's positive rule set. It does not add rules for DDL changes, and it does not add rules to a capture process's rule set.

To add subset rules to an outbound server's positive rule set: 

  1. Connect to the outbound server database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the ADD_SUBSET_OUTBOUND_RULES procedure, and specify the following parameters:

    • server_name - Specify the name of the outbound server.

    • table_name - Specify the table for which you want to capture and stream a subset of data.

    • condition - Specify the subset condition, which is similar to the WHERE clause in a SQL statement, to stream changes to a subset of rows in the table.

    • column_list - Specify the subset of columns to keep or discard, or specify NULL to keep all of the columns.

    • keep - Specify TRUE to keep the columns listed in the column_list parameter, or specify FALSE to discard the columns in the column_list parameter.

    When column_list is non-NULL and keep is set to TRUE, the procedure creates a keep columns declarative rule-based transformation for the columns listed in column_list.

    When column_list is non-NULL and keep is set to FALSE, the procedure creates a delete column declarative rule-based transformation for each column listed in column_list.

  3. If subset rules should also be added to the rule set of a capture process or propagation that streams row LCRs to the outbound server, then see Oracle Streams Concepts and Administration for information about adding rules to a rule set.

Example 5-3 Adding Rules That Stream Changes to a Subset of Rows in a Table

The following procedure creates rules that only evaluate to TRUE for row changes where the department_id value is 40 in the hr.employees table:

DECLARE
  cols DBMS_UTILITY.LNAME_ARRAY;
  BEGIN
    cols(1) := 'employee_id';
    cols(2) := 'first_name';
    cols(3) := 'last_name';
    cols(4) := 'email';
    cols(5) := 'phone_number';
    cols(6) := 'hire_date';
    cols(7) := 'job_id';
    cols(8) := 'salary';
    cols(9) := 'commission_pct';
    cols(10) := 'manager_id';
    cols(11) := 'department_id';
  DBMS_XSTREAM_ADM.ADD_SUBSET_OUTBOUND_RULES(
    server_name => 'xout',
    table_name  => 'hr.employees',
    condition   => 'department_id=40',
    column_list => cols); 
END;
/

Example 5-4 Adding Rules That Stream Changes to a Subset of Rows and Columns in a Table

The following procedure creates rules that only evaluate to TRUE for row changes where the department_id value is 40 for the hr.employees table. The procedure also creates delete column declarative rule-based transformations for the salary and commission_pct columns.

BEGIN
  DBMS_XSTREAM_ADM.ADD_SUBSET_OUTBOUND_RULES(
    server_name => 'xout',
    table_name  => 'hr.employees',
    condition   => 'department_id=40',
    column_list => 'salary,commission_pct', 
    keep        => FALSE);
END;
/

See Also:


Removing Rules from an XStream Out Configuration

This section describes removing schema rules, table rules, and subset rules from an XStream Out configuration.

This section contains these topics:

Removing Schema Rules and Table Rules From an XStream Out Configuration

This section describes removing schema rules and table rules from an XStream Out configuration using the ALTER_OUTBOUND procedure in the DBMS_XSTREAM_ADM package. The ALTER_OUTBOUND procedure removes rules for both DML and DDL changes.

When you follow the instructions in this section, the ALTER_OUTBOUND procedure always removes rules for the specified schemas and tables from one of the outbound server's rule sets. If the DBMS_XSTREAM_ADM package can manage the outbound server's capture process, then the ALTER_OUTBOUND procedure also removes rules for the specified schemas and tables from one of the rule sets used by this capture process.

To determine whether the DBMS_XSTREAM_ADM package can manage the outbound server's capture process, see "Checking Whether the DBMS_XSTREAM_ADM Package Can Manage a Capture Process". If the DBMS_XSTREAM_ADM package cannot manage the outbound server's capture process, then the ALTER_OUTBOUND procedure removes rules from the outbound server's rule set only. In this case, if you must remove the rules for same schemas and tables from the capture process's rule set as well, then see Oracle Streams Concepts and Administration for instructions.

In addition, if the capture process is running on a different database than the outbound server, then remove the schema and table rules from the propagation that sends LCRs to the outbound server's database. See Oracle Streams Concepts and Administration for instructions.

To remove schema rules and table rules from an XStream Out configuration: 

  1. Connect to the outbound server database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the ALTER_OUTBOUND procedure, and specify the following parameters:

    • server_name - Specify the name of the outbound server.

    • table_names - Specify the tables for which to remove rules, or specify NULL to remove no table rules.

    • schema_name - Specify the schemas for which to remove rules, or specify NULL to remove no schema rules.

    • add - Specify FALSE so that the rules are removed. (Rules are added if you specify TRUE.)

    • inclusion_rule - Specify TRUE to remove rules from the positive rule set of the outbound server, or specify FALSE to remove rules from the negative rule set of the outbound server. If the DBMS_XSTREAM_ADM package can manage the outbound server's capture process, then rules are also removed from this capture process's rule set.

    The following examples remove rules from the configuration of an outbound server named xout.

    Example 5-5 Removing Rules for the hr Schema, oe.orders Table, and oe.order_items Table from the Positive Rule Set

    BEGIN
      DBMS_XSTREAM_ADM.ALTER_OUTBOUND(
        server_name    => 'xout',
        table_names    => 'oe.orders, oe.order_items',
        schema_names   => 'hr',
        add            => FALSE,
        inclusion_rule => TRUE);
    END;
    /
    

    Example 5-6 Removing Rules for the hr Schema from the Negative Rule Set

    BEGIN
      DBMS_XSTREAM_ADM.ALTER_OUTBOUND(
        server_name    => 'xout',
        table_names    => NULL,
        schema_names   => 'hr',
        add            => FALSE,
        inclusion_rule => FALSE);
    END;
    /
    
Removing Subset Rules from an Outbound Server's Positive Rule Set

This section describes removing subset rules from an outbound server's positive rule set using the REMOVE_SUBSET_OUTBOUND_RULES procedure in the DBMS_XSTREAM_ADM package. The REMOVE_SUBSET_OUTBOUND_RULES procedure only removes rules for DML changes. It does not remove rules for DDL changes, and it does not remove rules from a capture process's rule set.

To remove subset rules from an outbound server's positive rule set: 

  1. Connect to the outbound server database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Determine the rule names for the subset rules by running the following query:

    SELECT RULE_OWNER, SUBSETTING_OPERATION, RULE_NAME 
       FROM DBA_XSTREAM_RULES 
       WHERE SUBSETTING_OPERATION IS NOT NULL;
    
  3. Run the REMOVE_SUBSET_OUTBOUND_RULES procedure, and specify the rules to remove from the list of rules displayed in Step 2.

    For example, assume that Step 2 returned the following results:

    RULE_OWNER                     SUBSET RULE_NAME
    ------------------------------ ------ ------------------------------
    XSTRMADMIN                     INSERT EMPLOYEES71
    XSTRMADMIN                     UPDATE EMPLOYEES72
    XSTRMADMIN                     DELETE EMPLOYEES73
    

    Example 5-7 Removing Subset Rules From an Outbound Server's Positive Rule Set

    To remove these rules from the positive rule set of the xout outbound server, run the following procedure:

    BEGIN
      DBMS_XSTREAM_ADM.REMOVE_SUBSET_OUTBOUND_RULES(
        server_name      => 'xout',
        insert_rule_name => 'xstrmadmin.employees71', 
        update_rule_name => 'xstrmadmin.employees72', 
        delete_rule_name => 'xstrmadmin.employees73');
    END;
    /
    
  4. If subset rules should also be removed from the rule set of a capture process and propagation that streams row LCRs to the outbound server, then see Oracle Streams Concepts and Administration for information about removing rules.

Changing the Connect User for an Outbound Server

A client application can connect to an outbound server as the connect user. This section describes changing the connect user for an outbound server using the ALTER_OUTBOUND procedure in the DBMS_XSTREAM_ADM package.

The connect user is the user who can attach to the outbound server to retrieve the LCR stream. The client application must attach to the outbound server as the connect user.

You can change the connect user when a client application must connect to an outbound server as a different user. Ensure that the connect user is granted the required privileges.


See Also:

"CREATE_OUTBOUND Procedure" for information about the privileges required by a connect user

To change the connect user for an outbound server: 

  1. Connect to the outbound server database as the XStream administrator.

    The XStream administrator must be granted the DBA role to change the connect user for an outbound server.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the ALTER_OUTBOUND procedure, and specify the following parameters:

    • server_name - Specify the name of the outbound server.

    • connect_user - Specify the new connect user.

    Example 5-8 Changing the Connect User for an Outbound Server

    To change the connect user to hr for an outbound server named xout, run the following procedure:

    BEGIN
      DBMS_XSTREAM_ADM.ALTER_OUTBOUND(
        server_name  => 'xout',
        connect_user => 'hr');
    END;
    /
    

Changing the Capture User of the Capture Process for an Outbound Server

A capture user is the user in whose security domain a capture process captures changes from the redo log. This section describes changing the capture user for a capture process that captures changes for an outbound server using the ALTER_OUTBOUND procedure in the DBMS_XSTREAM_ADM package.

You can change the capture user when the capture process must capture changes in a different security domain. Ensure that the capture user is granted the required privileges. When you change the capture user, the ALTER_OUTBOUND procedure grants the new capture user enqueue privilege on the queue used by the capture process and configures the user as a secure queue user.


Note:

If Oracle Database Vault is installed, then the user who changes the capture user must be granted the BECOME USER system privilege. Granting this privilege to the user is not required if Oracle Database Vault is not installed. You can revoke the BECOME USER system privilege from the user after capture user is changed, if necessary.


See Also:

"CREATE_OUTBOUND Procedure" for information about the privileges required by a capture user

To change the capture user of the capture process for an outbound server: 

  1. Connect to the outbound server database as the XStream administrator.

    To change the capture user, the user who invokes the ALTER_OUTBOUND procedure must be granted DBA role. Only the SYS user can set the capture user to SYS.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Determine whether the DBMS_XSTREAM_ADM package can manage the capture process. See "Checking Whether the DBMS_XSTREAM_ADM Package Can Manage a Capture Process".

    Based on the check, follow the appropriate instructions:

    • If the capture process can be managed using the DBMS_XSTREAM_ADM package, then proceed to Step 3.

    • If the capture process cannot be managed using the DBMS_XSTREAM_ADM package, then follow the instructions in Oracle Streams Concepts and Administration.

  3. Run the ALTER_OUTBOUND procedure, and specify the following parameters:

    • server_name - Specify the name of the outbound server.

    • capture_user - Specify the new capture user.

    Example 5-9 Changing the Capture User of the Capture Process for an Outbound Server

    To change the capture user to hq_admin for an outbound server named xout, run the following procedure:

    BEGIN
      DBMS_XSTREAM_ADM.ALTER_OUTBOUND(
        server_name  => 'xout',
        capture_user => 'hq_admin');
    END;
    /
    

Changing the Start SCN or Start Time of the Capture Process for an Outbound Server


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

This section describes changing the start system change number (SCN) or start time for a capture process that captures changes for an outbound server using the ALTER_OUTBOUND procedure in the DBMS_XSTREAM_ADM package.

The start SCN is the SCN from which a capture process begins to capture changes. The start time is the time from which a capture process begins to capture changes. When you reset a start SCN or start time for a capture process, ensure that the required redo log files are available to the capture process.

Typically, you reset the start SCN or start time for a capture process if point-in-time recovery was performed on one of the destination databases that receive changes from the capture process.

This section contains these topics:

Changing the Start SCN of the Capture Process for an Outbound Server

This section describes changing the start SCN of the capture process for an outbound server.

To change the start SCN for a capture process: 

  1. Connect to the outbound server database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Check the first SCN of the capture process:

    COLUMN CAPTURE_PROCESS HEADING 'Capture Process Name' FORMAT A30
    COLUMN FIRST_SCN HEADING 'First SCN' FORMAT 99999999999999
     
    SELECT CAPTURE_NAME, FIRST_SCN FROM DBA_CAPTURE;
    
    CAPTURE_NAME                         First SCN
    ------------------------------ ---------------
    CAP$_XOUT_1                             604426
    

    When you reset the start SCN, the specified start SCN must be equal to or greater than the first SCN for the capture process.

  3. Run the ALTER_OUTBOUND procedure, and specify the following parameters:

    • server_name - Specify the name of the outbound server.

    • start_scn - Specify the SCN from which the capture process begins to capture changes.

    If the capture process is enabled, then the ALTER_OUTBOUND procedure automatically stops and restarts the capture process when the start_scn parameter is non-NULL.

    If the capture process is disabled, then the ALTER_OUTBOUND procedure automatically starts the capture process when the start_scn parameter is non-NULL.

    Example 5-10 Setting the Start SCN of the Capture Process for an Outbound Server

    Run the following procedure to set the start SCN to 650000 for the capture process used by the xout outbound server:

    BEGIN
      DBMS_XSTREAM_ADM.ALTER_OUTBOUND(
        server_name => 'xout',
        start_scn    => 650000);
    END;
    /
    

Changing the Start Time of the Capture Process for an Outbound Server

This section describes changing the start time of the capture process for an outbound server.

To change the start time for a capture process: 

  1. Connect to the outbound server database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Check the time that corresponds with the first SCN of the capture process:

    COLUMN CAPTURE_PROCESS HEADING 'Capture Process Name' FORMAT A30
    COLUMN FIRST_SCN HEADING 'First SCN' FORMAT A40
     
    SELECT CAPTURE_NAME, SCN_TO_TIMESTAMP(FIRST_SCN) FIRST_SCN FROM DBA_CAPTURE;
    
    CAPTURE_NAME                   First SCN
    ------------------------------ ----------------------------------------
    CAP$_XOUT_1                    05-MAY-10 08.11.17.000000000 AM
    

    When you reset the start time, the specified start time must be greater than or equal to the time that corresponds with the first SCN for the capture process.

  3. Run the ALTER_OUTBOUND procedure, and specify the following parameters:

    • server_name - Specify the name of the outbound server.

    • start_time - Specify the time from which the capture process begins to capture changes.

    If the capture process is enabled, then the ALTER_OUTBOUND procedure automatically stops and restarts the capture process when the start_time parameter is non-NULL.

    If the capture process is disabled, then the ALTER_OUTBOUND procedure automatically starts the capture process when the start_time parameter is non-NULL.

    The following examples set the start_time parameter for the capture process that captures changes for an outbound server named xout.

    Example 5-11 Set the Start Time to a Specific Time

    Run the following procedure to set the start time to 05-MAY-10 11.11.17 AM for the capture process used by the xout outbound server:

    BEGIN
      DBMS_XSTREAM_ADM.ALTER_OUTBOUND(
        server_name => 'xout',
        start_time  => '05-MAY-10 11.11.17 AM');
    END;
    /
    

    Example 5-12 Set the Start Time Using the NUMTODSINTERVAL SQL Function

    Run the following procedure to set the start time to four hours earlier than the current time for the capture process used by the xout outbound server:

    DECLARE
      ts  TIMESTAMP;
    BEGIN
      ts := SYSTIMESTAMP - NUMTODSINTERVAL(4, 'HOUR');
      DBMS_XSTREAM_ADM.ALTER_OUTBOUND(
        server_name => 'xout',
        start_time  => ts);
    END;
    /
    

Dropping Components in an XStream Out Configuration

This section describes dropping an outbound server using the DROP_OUTBOUND procedure in the DBMS_XSTREAM_ADM package.

This procedure always drops the specified outbound server. This procedure also drops the queue used by the outbound server if both of the following conditions are met:

  • The queue was created by the ADD_OUTBOUND or CREATE_OUTBOUND procedure in the DBMS_XSTREAM_ADM package.

  • The outbound server is the only subscriber to the queue.

If either one of the preceding conditions is not met, then the DROP_OUTBOUND procedure only drops the outbound server. It does not drop the queue.

This procedure also drops the capture process for the outbound server if both of the following conditions are met:

If the procedure can drop the queue but cannot manage the capture process, then it drops the queue without dropping the capture process.

To drop an outbound server: 

  1. Connect to the outbound server database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the DROP_OUTBOUND procedure.

    Example 5-13 Dropping an Outbound Server

    To drop an outbound server named xout, run the following procedure:

    exec DBMS_XSTREAM_ADM.DROP_OUTBOUND('xout');
    

See Also:


Managing XStream In

This section describes managing an XStream In inbound server configuration.

This section contains these topics:


Note:

With XStream In, an Oracle Streams apply process functions as an inbound server. Therefore, you can use the instructions for managing an apply process to manage an inbound server. See Oracle Database 2 Day + Data Replication and Integration Guide and Oracle Streams Concepts and Administration.

Changing the Apply User for an Inbound Server

An inbound server applies messages in the security domain of its apply user, and the client application must attach to the inbound server as the apply user. This section describes changing the apply user for an inbound server using the ALTER_INBOUND procedure in the DBMS_XSTREAM_ADM package.

You can change the apply user when a client application must connect to an inbound server as a different user or when you want to apply changes using the privileges associated with a different user. Ensure that the apply user is granted the required privileges.


See Also:

"CREATE_INBOUND Procedure" for information about the privileges required by an apply user

To change the apply user for an inbound server: 

  1. Connect to the inbound server database as the XStream administrator.

    The XStream administrator must be granted the DBA role to change the apply user for an inbound server.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the ALTER_INBOUND procedure, and specify the following parameters:

    • server_name - Specify the name of the inbound server.

    • apply_user - Specify the new apply user.

    Example 5-14 Changing the Apply User for an Inbound Server

    To change the apply user to hr for an inbound server named xin, run the following procedure:

    BEGIN
      DBMS_XSTREAM_ADM.ALTER_INBOUND(
        server_name => 'xin',
        apply_user  => 'hr');
    END;
    /
    

See Also:


Managing Eager Errors Encountered by an Inbound Server


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

An inbound server can encounter an eager error when it cannot access all of the LCRs in an error transaction. The EAGER ERROR error type typically means that an LCR raised an error while the inbound server was receiving and applying LCRs in a large transaction. If an error transaction is not an eager error transaction, then it is referred to as a normal error transaction.

Normal error transactions and eager error transactions must be managed differently. An inbound server moves a normal error transaction, including all of its LCRs, to the error queue, but an inbound server does not move an eager error transaction to the error queue.

The following statements apply to both normal error transactions and eager error transactions:

  • The ALL_APPLY_ERROR and the DBA_APPLY_ERROR view contain information (metadata) about the error transaction.

  • The inbound server does not apply the error transaction.

Table 5-1 explains the options for managing a normal error transaction.

Table 5-1 Options Available for Managing a Normal Error Transaction

ActionMechanismsDescription

Delete the error transaction

DBMS_APPLY_ADM.DELETE_ERROR

DBMS_APPLY_ADM.DELETE_ALL_ERRORS

Oracle Enterprise Manager

The error transaction is deleted from the error queue, and the metadata about the error transaction is deleted. An inbound server does not try to reexecute the transaction when the inbound server is restarted. The transaction is not applied.

Execute the error transaction

DBMS_APPLY_ADM.EXECUTE_ERROR

DBMS_APPLY_ADM.EXECUTE_ALL_ERRORS

Oracle Enterprise Manager

The error transaction in the error queue is executed. If there are no errors during execution, then the transaction is applied. If an LCR raises an error during execution, then the normal error transaction is moved back to the error queue.

Retain the error transaction

None. (The error transaction is retained automatically.)

The error transaction remains in the error queue even if the inbound server is restarted. The metadata about the error transaction is also retained. The transaction is not applied.


Table 5-2 explains the options for managing an eager error transaction.

Table 5-2 Options Available for Managing an Eager Error Transaction

ActionMechanismsDescription

Delete error transaction

DBMS_APPLY_ADM.DELETE_ERROR

DBMS_APPLY_ADM.DELETE_ALL_ERRORS

Oracle Enterprise Manager

The metadata about the eager error transaction is deleted. When the inbound server is restarted, it attempts to execute the transaction as an eager transaction. If the inbound server does not encounter an error during execution, then the transaction is applied successfully. If the inbound server encounters an error during execution, then the eager error transaction is recorded.

Retain error transaction

None. (The metadata about the error transaction is retained automatically.)

The metadata about the eager error transaction is retained. When the inbound server is restarted, it attempts to execute the transaction as a normal transaction.

Specifically, the inbound server spills the transaction to disk and attempts to execute the transaction. If the inbound server does not encounter an error during execution, then the transaction is applied successfully. If the inbound server encounters an error during execution, then the transaction becomes a normal error transaction. In this case, the LCR that raised the error and all of the other LCRs in the transaction are moved to the error queue. After the normal error transaction is moved to the error queue, you must manage the error transaction as a normal error transaction (not an eager error transaction).



Note:

If you attempt to execute an eager error transaction manually using the DBMS_APPLY_ADM package or Oracle Enterprise Manager, then the following error is raised:
ORA-26909: cannot reexecute an eager error

An eager error transaction cannot be executed manually. Instead, it is executed automatically when the inbound server is enabled.


To manage an eager error transaction encountered by an inbound server: 

  1. Connect to the inT"bound server database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Query the ERROR_TYPE column in the ALL_APPLY_ERROR data dictionary view:

    SELECT APPLY_NAME, ERROR_TYPE FROM ALL_APPLY_ERROR;
    

    Follow the appropriate instructions based on the error type:

  3. Examine the error message raised by the LCR, and determine the cause of the error.

    See Oracle Database 2 Day + Data Replication and Integration Guide for information about checking for apply errors using Oracle Enterprise Manager.

    See Oracle Streams Concepts and Administration for information about checking for apply errors using the DBA_APPLY_ERROR data dictionary view.

  4. If possible, determine how to avoid the error, and make any changes necessary to avoid the error.

    Oracle Streams Concepts and Administration contains information about common apply errors.

  5. Either retain the error transaction or delete the error transaction:

    • Delete the error transaction only if you have corrected the problem. The inbound server reexecutes the transaction when it is enabled.

    • Retain the error transaction if you cannot correct the problem now or if you plan to reexecute it in the future.

    See Table 5-2 for more information about these choices.


    Caution:

    It might not be possible to recover a normal error transaction that is deleted. Before deleting the error transaction, ensure that the error type is EAGER ERROR.

    See Oracle Database 2 Day + Data Replication and Integration Guide for information about deleting an error transaction using Oracle Enterprise Manager.

    See Oracle Streams Concepts and Administration information about deleting an error transaction using the DBMS_APPLY_ADM package.

  6. If the inbound server is disabled, then start the inbound server.

    Query the STATUS column in the ALL_APPLY_ERROR view to determine whether the inbound server is enabled or disabled.

    If the disable_on_error apply parameter is set to Y for the inbound server, then the inbound server becomes disabled when it encounters the error and remains disabled.

    If the disable_on_error apply parameter is set to N for the inbound server, then the inbound server stops and restarts automatically when it encounters the error.

    See Table 5-2 for information about how the inbound server handles the error transaction based on your choice in Step 5.

    See Oracle Database 2 Day + Data Replication and Integration Guide for information about starting an apply process (or inbound server) using Oracle Enterprise Manager.

    See Oracle Streams Concepts and Administration for information about starting an apply process (or inbound server) using the DBMS_APPLY_ADM package.


Note:

If you have both purchased a license for the Oracle GoldenGate product and have enabled the XStream optimizations for Oracle Streams by running the DBMS_XSTREAM_ADM.ENABLE_GG_XSTREAM_FOR_STREAMS procedure, then an apply process in an Oracle Streams configuration can encounter errors of the EAGER ERROR type. Use the instructions in this section to manage eager apply process errors. When the XStream optimizations for Oracle Streams are not enabled, apply processes cannot encounter eager errors.

Dropping Components in an XStream In Configuration

This section describes dropping an inbound server using the DROP_INBOUND procedure in the DBMS_XSTREAM_ADM package.

This procedure always drops the specified inbound server. This procedure also drops the queue for the inbound server if both of the following conditions are met:

  • One call to the CREATE_INBOUND procedure created the inbound server and the queue.

  • The inbound server is the only subscriber to the queue.

If either one of the preceding conditions is not met, then the DROP_INBOUND procedure only drops the inbound server. It does not drop the queue.

To drop an inbound server: 

  1. Connect to the inbound server database as the XStream administrator.

    See Oracle Database Administrator's Guide for information about connecting to a database in SQL*Plus.

  2. Run the DROP_INBOUND procedure.

    Example 5-15 Dropping an Inbound Server

    To drop an inbound server named xin, run the following procedure:

    exec DBMS_XSTREAM_ADM.DROP_INBOUND('xin');
    
PK$Bc"T"PK"8AOEBPS/xstrm_auth.htmUl DBMS_XSTREAM_AUTH

9 DBMS_XSTREAM_AUTH

The DBMS_XSTREAM_AUTH package provides subprograms for granting privileges to and revoking privileges from XStream administrators.


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

This chapter contains the following topic:


Using DBMS_XSTREAM_AUTH

This section contains topics which relate to using the DBMS_XSTREAM_AUTH package.


Overview

This package provides subprograms for granting privileges to XStream administrators and revoking privileges from XStream administrators.


Security Model

Security on this package can be controlled in either of the following ways:

  • Granting EXECUTE on this package to selected users or roles.

  • Granting EXECUTE_CATALOG_ROLE to selected users or roles.

If subprograms in the package are run from within a stored procedure, then the user who runs the subprograms must be granted EXECUTE privilege on the package directly. It cannot be granted through a role.

To ensure that the user who runs the subprograms in this package has the necessary privileges, connect as an administrative user who can create users, grant privileges, and create tablespaces when using this package.


Summary of DBMS_XSTREAM_AUTH Subprograms

Table 9-1 DBMS_XSTREAM_AUTH Package Subprograms

SubprogramDescription

GRANT_ADMIN_PRIVILEGE Procedure


Either grants the privileges needed by a user to be an XStream administrator directly, or generates a script that grants these privileges

GRANT_REMOTE_ADMIN_ACCESS Procedure


Enables a remote XStream administrator to perform administrative actions at the local database by connecting to the grantee using a database link

REVOKE_ADMIN_PRIVILEGE Procedure


Either revokes XStream administrator privileges from a user directly, or generates a script that revokes these privileges

REVOKE_REMOTE_ADMIN_ACCESS Procedure


Disables a remote XStream administrator from performing administrative actions by connecting to the grantee using a database link



Note:

All subprograms commit unless specified otherwise.


GRANT_ADMIN_PRIVILEGE Procedure

This procedure either grants the privileges needed by a user to be an XStream administrator directly, or generates a script that grants these privileges.

Syntax

DBMS_XSTREAM_AUTH.GRANT_ADMIN_PRIVILEGE(
   grantee           IN  VARCHAR2,
   grant_privileges  IN  BOOLEAN   DEFAULT TRUE,
   file_name         IN  VARCHAR2  DEFAULT NULL,
   directory_name    IN  VARCHAR2  DEFAULT NULL);

Parameters

Table 9-2 GRANT_ADMIN_PRIVILEGE Procedure Parameters

ParameterDescription

grantee

The user to whom privileges are granted

grant_privileges

If TRUE, then the procedure grants the privileges to the specified grantee directly, and adds the grantee to the DBA_XSTREAM_ADMINISTRATOR data dictionary view with YES for both the LOCAL_PRIVILEGES column and the ACCESS_FROM_REMOTE column. If the user already has an entry in this data dictionary view, then the procedure does not make another entry, and no error is raised. If TRUE and any of the grant statements fails, then the procedure raises an error.

If FALSE, then the procedure does not grant the privileges to the specified grantee directly, and does not add the grantee to the DBA_XSTREAM_ADMINISTRATOR data dictionary view.

You specify FALSE when the procedure is generating a file that you will edit and then run. If you specify FALSE and either the file_name or directory_name parameter is NULL, then the procedure raises an error.

file_name

The name of the file generated by the procedure. The file contains all of the statements that grant the privileges. If a file with the specified file name exists in the specified directory name, then the grant statements are appended to the existing file.

If NULL, then the procedure does not generate a file.

directory_name

The directory into which the generated file is placed. The specified directory must be a directory object created using the SQL statement CREATE DIRECTORY. If you specify a directory, then the user who invokes the procedure must have the WRITE privilege on the directory object.

If the file_name parameter is NULL, then this parameter is ignored, and the procedure does not generate a file.

If NULL and the file_name parameter is non-NULL, then the procedure raises an error.


Usage Notes

The user who runs the procedure must be an administrative user who can grant privileges to other users.

Specifically, the procedure grants the following privileges to the specified user:

  • The RESTRICTED SESSION system privilege

  • EXECUTE on the following packages:

    • DBMS_APPLY_ADM

    • DBMS_AQ

    • DBMS_AQADM

    • DBMS_AQIN

    • DBMS_AQELM

    • DBMS_CAPTURE_ADM

    • DBMS_FLASHBACK

    • DBMS_LOCK

    • DBMS_PROPAGATION_ADM

    • DBMS_RULE_ADM

    • DBMS_STREAMS_ADM

    • DBMS_STREAMS_ADVISOR_ADM

    • DBMS_STREAMS_HANDLER_ADM

    • DBMS_STREAMS_MESSAGING

    • DBMS_TRANSFORM

    • DBMS_XSTREAM_ADM

  • Privileges to enqueue messages into and dequeue messages from any queue

  • Privileges to manage any queue

  • Privileges to create, alter, and execute any of the following types of objects in the user's own schema and in other schemas:

    • Evaluation contexts

    • Rule sets

    • Rules

    In addition, the grantee can grant these privileges to other users.

  • SELECT_CATALOG_ROLE

  • SELECT privilege on data dictionary views related to XStream and Oracle Streams

  • The ability to allow a remote XStream administrator to perform administrative actions through a database link by connecting to the grantee

    This ability is enabled by running the GRANT_REMOTE_ADMIN_ACCESS procedure in this package.


    Note:

    • To view all of the statements run by the procedure in detail, you can use the procedure to generate a script and then view the script in a text editor.

    • This procedure grants only the privileges necessary to configure and administer an XStream environment. You can grant additional privileges to the grantee if necessary.



GRANT_REMOTE_ADMIN_ACCESS Procedure

This procedure enables a remote XStream administrator to perform administrative actions at the local database by connecting to the grantee using a database link.

Syntax

DBMS_XSTREAM_AUTH.GRANT_REMOTE_ADMIN_ACCESS(
   grantee  IN  VARCHAR2);

Parameters

Table 9-3 GRANT_REMOTE_ADMIN_ACCESS Procedure Parameter

ParameterDescription

grantee

The user who allows remote access. The procedure adds the grantee to the DBA_XSTREAM_ADMINISTRATOR data dictionary view with YES for the ACCESS_FROM_REMOTE column. If the user already has an entry in this data dictionary view, then the procedure does not make another entry. Instead, it updates the ACCESS_FROM_REMOTE column to YES.


Usage Notes

Typically, you run the procedure and specify a grantee at a local source database if a downstream capture process captures changes originating at the local source database. The XStream administrator at a downstream capture database administers the source database using this connection.


Note:

The GRANT_ADMIN_PRIVILEGE procedure in this package runs this procedure.


REVOKE_ADMIN_PRIVILEGE Procedure

This procedure either revokes XStream administrator privileges from a user directly, or generates a script that revokes these privileges.

Syntax

DBMS_XSTREAM_AUTH.REVOKE_ADMIN_PRIVILEGE(
   grantee            IN  VARCHAR2,  
   revoke_privileges  IN  BOOLEAN   DEFAULT TRUE,
   file_name          IN  VARCHAR2  DEFAULT NULL,
   directory_name     IN  VARCHAR2  DEFAULT NULL);

Parameters

Table 9-4 REVOKE_ADMIN_PRIVILEGE Procedure Parameters

ParameterDescription

grantee

The user from whom privileges are revoked

revoke_privileges

If TRUE, then the procedure revokes the privileges from the specified user directly, and removes the user from the DBA_XSTREAM_ADMINISTRATOR data dictionary view. If the user does not have a record in this data dictionary view, then the procedure does not remove a record from the view, and no error is raised. If TRUE and any of the revoke statements fails, then the procedure raises an error. A revoke statement fails if the user is not granted the privilege that is being revoked.

If FALSE, then the procedure does not revoke the privileges from the specified user directly, and does not remove the user from the DBA_XSTREAM_ADMINISTRATOR data dictionary view.

You specify FALSE when the procedure is generating a file that you will edit and then run. If you specify FALSE and either the file_name or directory_name parameter is NULL, then the procedure does not raise an error.

file_name

The name of the file generated by this procedure. The file contains all of the statements that revoke the privileges. If a file with the specified file name exists in the specified directory name, then the revoke statements are appended to the existing file.

If NULL, then the procedure does not generate a file.

directory_name

The directory into which the generated file is placed. The specified directory must be a directory object created using the SQL statement CREATE DIRECTORY. If you specify a directory, then the user who invokes the procedure must have the WRITE privilege on the directory object.

If the file_name parameter is NULL, then this parameter is ignored, and the procedure does not generate a file.

If NULL and the file_name parameter is non-NULL, then the procedure raises an error.


Usage Notes

The user who runs this procedure must be an administrative user who can revoke privileges from other users. Specifically, this procedure revokes the privileges granted by running the GRANT_ADMIN_PRIVILEGE procedure in this package.


Note:

To view all of the statements run by this procedure in detail, you can use the procedure to generate a script and then view the script in a text editor.


See Also:



REVOKE_REMOTE_ADMIN_ACCESS Procedure

This procedure disables a remote XStream administrator from performing administrative actions by connecting to the grantee using a database link.


Note:

The REVOKE_ADMIN_PRIVILEGE procedure in this package runs this procedure.

Syntax

DBMS_XSTREAM_AUTH.REVOKE_REMOTE_ADMIN_ACCESS(
   grantee  IN  VARCHAR2);

Parameters

Table 9-5 REVOKE_REMOTE_ADMIN_ACCESS Procedure Parameter

ParameterDescription

grantee

The user for whom access from a remote XStream administrator is disabled.

If a row for the grantee exists in the DBA_XSTREAM_ADMINISTRATOR data dictionary view, then the procedure updates the ACCESS_FROM_REMOTE column for the grantee to NO. If, after this update, both the LOCAL_PRIVILEGES column and the ACCESS_FROM_REMOTE column are NO for the grantee, then the procedure removes the grantee from the view.

If no row for the grantee exists in the DBA_XSTREAM_ADMINISTRATOR data dictionary view, then the procedure does not update the view and does not raise an error.


PK}ZlUlPK"8AOEBPS/xstrm_xstream_adm.htm DBMS_XSTREAM_ADM

8 DBMS_XSTREAM_ADM

This DBMS_XSTREAM_ADM package provides interfaces for streaming database changes between an Oracle database and other systems. XStream enables applications to stream out or stream in database changes.

This chapter contains the following topic:


Using DBMS_XSTREAM_ADM

This section contains topics which relate to using the DBMS_XSTREAM_ADM package.


Overview

The package provides interfaces for configuring outbound servers that stream database changes from an Oracle database to other systems. The package also provides interfaces for configuring inbound servers that stream database changes from other systems to an Oracle database. In both cases, the database changes are encapsulated in logical change records (LCRs). Also, the other systems can be Oracle systems or a non-Oracle systems, such as non-Oracle databases or file systems.

XStream outbound servers can stream out LCRs from an Oracle database programmatically using C or Java. After receiving the LCRs, the other system can process them in any customized way. For example, the other system can save the contents of the LCRs to a file, send the LCRs to an Oracle database through an XStream inbound server, or generate SQL statements and execute them on any Oracle or non-Oracle databases.

XStream inbound servers accept LCRs from another system and either apply them to an Oracle database or process them in a customized way using apply handlers.


Security Model

To ensure that the user who runs the subprograms in this package has the necessary privileges, configure an XStream administrator and connect as the XStream administrator when using this package.

An administrator must be granted the DBA role when the administrator is performing any of the following actions:

  • Running the ADD_OUTBOUND procedure while connected as a user that is different from the configured connect user for an outbound server

  • Running the ALTER_OUTBOUND procedure to change the capture user for a capture process or the connect user for an outbound server

  • Running the CREATE_OUTBOUND procedure, because this procedure creates a capture process

  • Running the ALTER_INBOUND procedure to change the apply user for an inbound server

  • Running the ADD_INBOUND procedure while connected as a user that is different from the configured apply user for an inbound server

When the administrator does not need to perform the preceding tasks, the DBA role is not required.


See Also:



Operational Notes

Some subprograms in the DBMS_APPLY_ADM package can manage XStream outbound servers, and some subprograms in the DBMS_APPLY_ADM package can manage XStream inbound servers.


See Also:

Oracle Database PL/SQL Packages and Types Reference for details about which subprograms can manage outbound servers and inbound servers


Summary of DBMS_XSTREAM_ADM Subprograms

Table 8-1 DBMS_XSTREAM_ADM Package Subprograms

SubprogramDescription

ADD_OUTBOUND Procedure


Creates an XStream outbound server that dequeues LCRs from the specified queue

ADD_SUBSET_OUTBOUND_RULES Procedure


Adds subset rules to an outbound server configuration

ALTER_INBOUND Procedure


Modifies an XStream inbound server

ALTER_OUTBOUND Procedure


Modifies an XStream outbound server

CREATE_INBOUND Procedure


Creates an XStream inbound server and its queue

CREATE_OUTBOUND Procedure


Creates an XStream outbound server, queue, and capture process to enable XStream client applications to stream out Oracle database changes encapsulated in LCRs

DROP_INBOUND Procedure


Removes an inbound server configuration

DROP_OUTBOUND Procedure


Removes an outbound server configuration

ENABLE_GG_XSTREAM_FOR_STREAMS Procedure


Enables XStream performance optimizations for Oracle Streams components

IS_GG_XSTREAM_FOR_STREAMS Function


Returns TRUE if XStream performance optimizations are enabled for Oracle Streams components, or returns FALSE if XStream performance optimizations are disabled for Oracle Streams components

REMOVE_SUBSET_OUTBOUND_RULES Procedure


Removes subset rules from an outbound server configuration



Note:

All subprograms commit unless specified otherwise.


ADD_OUTBOUND Procedure

This procedure creates an XStream outbound server that dequeues LCRs from the specified queue. The outbound server streams out the LCRs to an XStream client application.

This procedure creates neither a capture process nor a queue. To create an outbound server, a capture process, and a queue with one procedure call, use the CREATE_OUTBOUND Procedure.

To create the capture process individually, use one of the following packages:

  • DBMS_STREAMS_ADM

  • DBMS_CAPTURE_ADM

To create a queue individually, use the SET_UP_QUEUE procedure in the DBMS_STREAMS_ADM package.

This procedure is overloaded. One table_names parameter is type VARCHAR2 and the other table_names parameter is type DBMS_UTILITY.UNCL_ARRAY. Also, one schema_names parameter is type VARCHAR2 and the other schema_names parameter is type DBMS_UTILITY.UNCL_ARRAY. These parameters enable you to enter the lists of tables and schemas in different ways and are mutually exclusive.


Note:

  • A client application can create multiple sessions. Each session can attach to only one outbound server, and each outbound server can serve only one session at a time. However, different client application sessions can connect to different outbound servers. See Part IV, "XStream OCI API Reference" and Oracle Database XStream Java API Reference for information about attaching to an outbound server.

  • This procedure enables the outbound server that it creates.

  • Starting with Oracle Database 11g Release 2 (11.2.0.2), the capture_name, start_scn, and start_time parameters are included in this procedure.


Syntax

DBMS_XSTREAM_ADM.ADD_OUTBOUND(
   server_name     IN  VARCHAR2,
   queue_name      IN  VARCHAR2   DEFAULT NULL,
   source_database IN  VARCHAR2   DEFAULT NULL,
   table_names     IN  DBMS_UTILITY.UNCL_ARRAY,
   schema_names    IN  DBMS_UTILITY.UNCL_ARRAY,
   connect_user    IN  VARCHAR2   DEFAULT NULL,
   comment         IN  VARCHAR2   DEFAULT NULL,
   capture_name    IN  VARCHAR2   DEFAULT NULL,
   start_scn       IN  NUMBER     DEFAULT NULL,
   start_time      IN  TIMESTAMP  DEFAULT NULL);

DBMS_XSTREAM_ADM.ADD_OUTBOUND(
   server_name     IN  VARCHAR2,
   queue_name      IN  VARCHAR2   DEFAULT NULL,
   source_database IN  VARCHAR2   DEFAULT NULL,
   table_names     IN  VARCHAR2   DEFAULT NULL,
   schema_names    IN  VARCHAR2   DEFAULT NULL,
   connect_user    IN  VARCHAR2   DEFAULT NULL,
   comment         IN  VARCHAR2   DEFAULT NULL,
   capture_name    IN  VARCHAR2   DEFAULT NULL,
   start_scn       IN  NUMBER     DEFAULT NULL,
   start_time      IN  TIMESTAMP  DEFAULT NULL);

Parameters

Table 8-2 ADD_OUTBOUND Procedure Parameters

ParameterDescription

server_name

The name of the outbound server being created. A NULL specification is not allowed. Do not specify an owner.

The specified name must not match the name of an existing outbound server, inbound server, apply process, or messaging client.

Note: The server_name setting cannot be altered after the outbound server is created.

queue_name

The name of the local queue from which the outbound server dequeues LCRs, specified as [schema_name.]queue_name. The current database must contain the queue, and the queue must be ANYDATA type.

For example, to specify a queue named xstream_queue in the xstrmadmin schema, enter xstrmadmin.xstream_queue for this parameter. If the schema is not specified, then the current user is the default.

If NULL, the procedure raises an error.

source_database

The global name of the source database. The source database is where the changes being captured originated.

If you do not include the domain name, then the procedure appends it to the database name automatically. For example, if you specify DBS1 and the domain is EXAMPLE.COM, then the procedure specifies DBS1.EXAMPLE.COM automatically.

If NULL, then this procedure does not add a condition regarding the source database to the generated rules. Otherwise, a condition regarding the source database is added.

table_names

The tables for which data manipulation language (DML) and data definition language (DDL) changes are streamed out to the XStream client application. The tables can be specified in the following ways:

  • Comma-delimited list of type VARCHAR2.

  • A PL/SQL associative array of type DBMS_UTILITY.UNCL_ARRAY, where each element is the name of a table. Specify the first table in position 1. The last position must be NULL.

Each table should be specified as [schema_name.]table_name. For example, you can specify hr.employees. If the schema is not specified, then the current user is the default.

See Also: "Usage Notes" for more information about this parameter

schema_names

The schemas for which DML and DDL changes are streamed out to the XStream client application. The schemas can be specified in the following ways:

  • Comma-delimited list of type VARCHAR2.

  • A PL/SQL associative array of type DBMS_UTILITY.UNCL_ARRAY, where each element is the name of a schema. Specify the first schema in position 1. The last position must be NULL.

Note: This procedure does not concatenate the schema_names parameter with the table_names parameter. To specify tables, enter fully qualified table names in the table_names parameter (schema_name.table_name).

See Also: "Usage Notes" for more information about this parameter

connect_user

The user who can attach to the specified outbound server to retrieve the LCR stream. The client application must attach to the outbound server as the specified connect user. See "CREATE_OUTBOUND Procedure" for information about the privileges required by a connect user.

If NULL, then the current user is the default.

comment

An optional comment associated with the outbound server.

capture_name

The name of the capture process configured to capture changes for the outbound server. Do not specify an owner.

If the specified name matches the name of an existing capture process for another outbound server, then the procedure uses the existing capture process and adds the rules for capturing changes to the database to the positive capture process rule set.

If the specified name matches the name of an existing capture process for an apply process, then an error is raised.

If the specified name does not match the name of an existing capture process, then an error is raised.

If NULL, then the outbound server is created without a capture process.

start_scn

A valid system change number (SCN) for the database from which the capture process starts capturing changes.

If the capture_name parameter is NULL, then this parameter is ignored.

If NULL and the capture_name parameter is non-NULL, then the start SCN of the capture process is not changed.

An error is returned if an invalid SCN is specified.

The start_scn and start_time parameters are mutually exclusive.

start_time

A valid time from which the capture process starts capturing changes.

If the capture_name parameter is NULL, then this parameter is ignored.

If NULL and the capture_name parameter is non-NULL, then the start SCN of the capture process is not changed.

The start_scn and start_time parameters are mutually exclusive.


Usage Notes

The following list describes the behavior of the outbound server for various combinations of the table_names and schema_names parameters:

  • If both the table_names and schema_names parameters are NULL or empty, then the outbound server streams all DML and DDL changes to the client application.

    This procedure is overloaded. The table_names and schema_names parameters are defaulted to NULL. Do not specify NULL for both table_names and schema_names in the same call; otherwise, error PLS-00307 is returned.

  • If both the table_names and schema_names parameters are specified, then the outbound server streams DML and DDL changes for the specified tables and schemas.

  • If the table_names parameter is specified and the schema_names parameter is NULL or empty, then the outbound server streams DML and DDL changes for the specified tables.

  • If the table_names parameter is NULL or empty and the schema_names parameter is specified, then the outbound server streams DML and DDL changes for the specified schemas.

For the procedure that uses the DBMS_UTILITY.UNCL_ARRAY type for the table_names and schema_names parameters, both parameters must be specified. To specify only tables, the schema_names parameter must be specified and empty. To specify only schemas, the table_names parameter must be specified and empty.


Note:

An empty array includes one NULL entry.


ADD_SUBSET_OUTBOUND_RULES Procedure

This procedure adds subset rules to an outbound server configuration. Subset rules instruct the outbound server to stream out a subset of the changes to the specified tables. Outbound servers can stream out a subset of both rows and columns.

This procedure is overloaded. One column_list parameter is type VARCHAR2 and the other column_list parameter is type DBMS_UTILITY.LNAME_ARRAY. These parameters enable you to enter the list of columns in different ways and are mutually exclusive.


Note:

This procedure does not add rules to the outbound server's capture process.

Syntax

DBMS_XSTREAM_ADM.ADD_SUBSET_OUTBOUND_RULES(
   server_name IN VARCHAR2,
   table_name  IN VARCHAR2,
   condition   IN VARCHAR2  DEFAULT NULL,
   column_list IN DBMS_UTILITY.LNAME_ARRAY,
   keep        IN BOOLEAN   DEFAULT TRUE);

DBMS_XSTREAM_ADM.ADD_SUBSET_OUTBOUND_RULES(
   server_name IN VARCHAR2,
   table_name  IN VARCHAR2,
   condition   IN VARCHAR2  DEFAULT NULL,
   column_list IN VARCHAR2  DEFAULT NULL, 
   keep        IN BOOLEAN   DEFAULT TRUE);

Parameters

Table 8-3 ADD_SUBSET_OUTBOUND_RULES Procedure Parameters

ParameterDescription

server_name

The name of the outbound server to which rules are being added. Specify an existing outbound server. Do not specify an owner.

table_name

The name of the table specified as [schema_name.]object_name. For example, you can specify hr.employees. If the schema is not specified, then the current user is the default.

If the outbound server configuration uses a local capture process, then the table must exist at the local source database. If the outbound server configuration uses a downstream capture process, then the table must exist at both the source database and at the downstream capture database.

The specified table cannot have any LOB, LONG, or LONG RAW columns currently or in the future.

condition

The subset condition. Specify this condition similar to the way you specify conditions in a WHERE clause in SQL.

For example, to specify rows in the hr.employees table where the salary is greater than 4000 and the job_id is SA_MAN, enter the following as the condition:

' salary > 4000 and job_id = ''SA_MAN'' '

If NULL, then the procedure raises an error.

Note: The quotation marks in the preceding example are all single quotation marks.

column_list

The list of columns either to include in the outbound server configuration or to exclude from the outbound server configuration. Whether the columns are included or excluded depends on the setting for the keep parameter.

The columns can be specified in the following ways:

  • Comma-delimited list of type VARCHAR2.

  • A PL/SQL associative array of type DBMS_UTILITY.LNAME_ARRAY, where each element is the name of a column. Specify the first column in position 1. The last position must be NULL.

To include or exclude all of the columns in a table, specify each column in the table in the list or array.

If NULL, then the procedure raises an error.

keep

If TRUE, then the columns specified in the column_list parameter are kept as part of the outbound server configuration. Therefore, changes to these columns that satisfy the condition in the condition parameter are streamed to the outbound server's client application.

If FALSE, then the columns specified in the column_list parameter are excluded from the outbound server configuration. Therefore, changes to these columns are not streamed to the outbound server's client application.

See Also: "Usage Notes"


Usage Notes

When the keep parameter is set to TRUE, this procedure creates a keep columns declarative rule-based transformation for the columns listed in column_list.

When the keep parameter is set to FALSE, this procedure creates a delete column declarative rule-based transformation for each column listed in column_list.


See Also:

Oracle Streams Concepts and Administration for information about declarative rule-based transformations


ALTER_INBOUND Procedure

This procedure modifies an XStream inbound server.

Syntax

DBMS_XSTREAM_ADM.ALTER_INBOUND(
   server_name IN VARCHAR2,
   apply_user  IN VARCHAR2  DEFAULT NULL,  
   comment     IN VARCHAR2  DEFAULT NULL);

Parameters

Table 8-4 ALTER_INBOUND Procedure Parameters

ParameterDescription

server_name

The name of the inbound server being altered. Specify an existing inbound server. Do not specify an owner.

apply_user

The user who applies all DML and DDL changes that satisfy the inbound server rule sets, who runs user-defined apply handlers, and who runs custom rule-based transformations configured for inbound server rules.

The client application must attach to the inbound server as the apply user.

Specify a user to change the apply user. In this case, the user who invokes the ALTER_INBOUND procedure must be granted the DBA role. Only the SYS user can set the apply_user to SYS.

If NULL, then the apply user is not changed.

See "CREATE_INBOUND Procedure" for information about the required privileges for an apply user.

comment

An optional comment associated with the inbound server.

If non-NULL, then the specified comment replaces the existing comment.

If NULL, then the existing comment is not changed.



ALTER_OUTBOUND Procedure

This procedure modifies an XStream outbound server configuration.

This procedure always alters the specified outbound server. This procedure can also alter the outbound server's capture process when either of the following conditions is met:

  • The capture process was created by the CREATE_OUTBOUND procedure in this package.

  • The queue used by the capture process was created by the CREATE_OUTBOUND procedure.

To check whether this procedure can alter the outbound server's capture process, query the CAPTURE_NAME column in the DBA_XSTREAM_OUTBOUND view. When the name of the capture process appears in the CAPTURE_NAME column of this view, the ALTER_OUTBOUND procedure can manage the capture process's rules or change the capture user for the capture process. When the CAPTURE_NAME column of this view is NULL, the ALTER_OUTBOUND procedure cannot manage the capture process.

This procedure is overloaded. One table_names parameter is type VARCHAR2 and the other table_names parameter is type DBMS_UTILITY.UNCL_ARRAY. Also, one schema_names parameter is type VARCHAR2 and the other schema_names parameter is type DBMS_UTILITY.UNCL_ARRAY. These parameters enable you to enter the list of tables and schemas in different ways and are mutually exclusive.


Note:

Starting with Oracle Database 11g Release 2 (11.2.0.2), the start_scn and start_time parameters are included in this procedure.

Syntax

DBMS_XSTREAM_ADM.ALTER_OUTBOUND(
   server_name    IN VARCHAR2,
   table_names    IN DBMS_UTILITY.UNCL_ARRAY,
   schema_names   IN DBMS_UTILITY.UNCL_ARRAY,
   add            IN BOOLEAN    DEFAULT TRUE,
   capture_user   IN VARCHAR2   DEFAULT NULL,
   connect_user   IN VARCHR2    DEFAULT NULL,
   comment        IN VARCHAR2   DEFAULT NULL,
   inclusion_rule IN BOOLEAN    DEFAULT TRUE,
   start_scn      IN NUMBER     DEFAULT NULL,
   start_time     IN TIMESTAMP  DEFAULT NULL);

DBMS_XSTREAM_ADM.ALTER_OUTBOUND(
   server_name    IN VARCHAR2,
   table_names    IN VARCHAR2   DEFAULT NULL,
   schema_names   IN VARCHAR2   DEFAULT NULL,
   add            IN BOOLEAN    DEFAULT TRUE,
   capture_user   IN VARCHAR2   DEFAULT NULL,
   connect_user   IN VARCHAR2   DEFAULT NULL,
   comment        IN VARCHAR2   DEFAULT NULL,
   inclusion_rule IN BOOLEAN    DEFAULT TRUE,
   start_scn      IN NUMBER     DEFAULT NULL,
   start_time     IN TIMESTAMP  DEFAULT NULL);

Parameters

Table 8-5 ALTER_OUTBOUND Procedure Parameters

ParameterDescription

server_name

The name of the outbound server being altered. Specify an existing outbound server. Do not specify an owner.

table_names

The tables that are either added to or removed from the XStream Out configuration. Whether the tables are added or removed depends on the setting for the add parameter.

The tables can be specified in the following ways:

  • Comma-delimited list of type VARCHAR2.

  • A PL/SQL associative array of type DBMS_UTILITY.UNCL_ARRAY, where each element is the name of a table. Specify the first table in position 1. The last position must be NULL.

Each table should be specified as [schema_name.]table_name. For example, hr.employees. If the schema is not specified, then the current user is the default.

See Also: "Usage Notes" for more information about this parameter

schema_names

The schemas that are either added to or removed from the XStream Out configuration. Whether the schemas are added or removed depends on the setting for the add parameter.

The schemas can be specified in the following ways:

  • Comma-delimited list of type VARCHAR2.

  • A PL/SQL associative array of type DBMS_UTILITY.UNCL_ARRAY, where each element is the name of a schema. Specify the first schema in position 1. The last position must be NULL.

Note: This procedure does not concatenate the schema_names parameter with the table_names parameter. To specify tables, enter fully qualified table names in the table_names parameter (schema_name.table_name).

See Also: "Usage Notes" for more information about this parameter

add

If TRUE, then the procedure adds to the XStream Out configuration the tables specified in the table_names parameter and the schemas specified in the schema_names parameter.

If FALSE, then the procedure removes from the XStream Out configuration the tables specified in the table_names parameter and the schemas specified in the schema_names parameter.

capture_user

The user in whose security domain a capture process captures changes that satisfy its rule sets and runs custom rule-based transformations configured for capture process rules.

Specify a user to change the capture user. In this case, the user who invokes the ALTER_OUTBOUND procedure must be granted the DBA role. Only the SYS user can set the capture_user to SYS.

If NULL, then the capture user is not changed.

If you change the capture user, then this procedure grants the new capture user enqueue privilege on the queue used by the capture process and configures the user as a secure queue user.

Ensure that the capture user is granted the other required privileges. See "CREATE_OUTBOUND Procedure" for information about the privileges required by a capture user.

The capture process is stopped and restarted automatically when you change the value of this parameter.

Note: If the capture user for a capture process is dropped using DROP USER . . .  CASCADE, then the capture process is also dropped automatically.

connect_user

The user who can attach to the specified outbound server to retrieve the change stream. The XStream client application must attach to the outbound server as the specified connect user.

Specify a user to change the connect user. In this case, the user who invokes the ALTER_OUTBOUND procedure must be granted the DBA role. Only the SYS user can set the connect_user to SYS.

If NULL, then the connect user is not changed.

If you change the connect user, then this procedure grants the new connect user dequeue privileges on the queue used by the outbound server and configures the user as a secure queue user.

Ensure that the connect user is granted the other required privileges. See "CREATE_OUTBOUND Procedure" for information about the privileges required by a connect user.

comment

An optional comment associated with the outbound server.

If non-NULL, then the specified comment replaces the existing comment.

If NULL, then the existing comment is not changed.

inclusion_rule

If TRUE and the add parameter is set to TRUE, then the procedure adds rules for the tables specified in the table_names parameter and the schemas specified in the schema_names parameter to the positive rule sets in the XStream Out configuration. When rules for tables and schemas are in positive rule sets, the XStream Out configuration streams DML and DDL changes to the tables and schemas out to the client application.

If TRUE and the add parameter is set to FALSE, then the procedure removes rules for the tables specified in the table_names parameter and the schemas specified in the schema_names parameter from the positive rule sets in the XStream Out configuration.

If FALSE and the add parameter is set to TRUE, then the procedure adds rules for the tables specified in the table_names parameter and the schemas specified in the schema_names parameter to the negative rule sets in the XStream Out configuration. When rules for tables and schemas are in negative rule sets, the XStream Out configuration does not stream changes to the tables and schemas out to the client application.

If FALSE and the add parameter is set to FALSE, then the procedure removes rules for the tables specified in the table_names parameter and the schemas specified in the schema_names parameter from the negative rule sets in the XStream Out configuration.

start_scn

A valid SCN for the database from which the capture process starts capturing changes. To be valid, the SCN value must be greater than or equal to the first SCN for the capture process.

If a valid SCN is specified, then the capture process captures changes from the specified SCN when it is restarted.

An error is returned if an invalid SCN is specified.

If NULL and the start_time parameter is NULL, then the start SCN is not changed.

If NULL and the start_time parameter is non-NULL, then the start SCN is changed to match the specified start time.

The start_scn and start_time parameters are mutually exclusive.

Note: If the capture process is enabled, then the ALTER_OUTBOUND procedure automatically stops and restarts the capture process when the start_scn parameter is non-NULL. If the capture process is disabled, then the ALTER_OUTBOUND procedure automatically starts the capture process when the start_scn parameter is non-NULL.

start_time

A valid time from which the capture process starts capturing changes. To be valid, the time must correspond to an SCN value that is greater than or equal to the first SCN for the capture process.

If a valid time is specified, then the capture process captures changes from the specified time when it is restarted.

An error is returned if an invalid time is specified.

If NULL and the start_scn parameter is NULL, then the start time is not changed.

If NULL and the start_scn parameter is non-NULL, then the start time is changed to match the specified start SCN.

The start_scn and start_time parameters are mutually exclusive.

Note: If the capture process is enabled, then the ALTER_OUTBOUND procedure automatically stops and restarts the capture process when the start_time parameter is non-NULL. If the capture process is disabled, then the ALTER_OUTBOUND procedure automatically starts the capture process when the start_time parameter is non-NULL.


Usage Notes

The following list describes the behavior of the outbound server for various combinations of the table_names and schema_names parameters:

  • If both the table_names and schema_names parameters are NULL or empty, then no rules are changed for the XStream Out configuration.

    This procedure is overloaded. The table_names and schema_names parameters are defaulted to NULL. Do not specify NULL for both table_names and schema_names in the same call; otherwise, error PLS-00307 is returned.

  • If both the table_names and schema_names parameters are specified, then the rules for the tables and schemas are added to or removed from the XStream Out configuration, depending on the setting of the add parameter.

  • If the table_names parameter is specified and the schema_names parameter is NULL or empty, then the rules for the tables are added to or removed from the XStream Out configuration, depending on the setting of the add parameter. The existing rules for schemas are not changed for the XStream Out configuration.

  • If the table_names parameter is NULL or empty and the schema_names parameter is specified, then the rules for the schemas are added to or removed from the XStream Out configuration, depending on the setting of the add parameter. The existing rules for tables are not changed for the XStream Out configuration.

For the procedure that uses the DBMS_UTILITY.UNCL_ARRAY type for the table_names and schema_names parameters, both parameters must be specified. To specify only tables, the schema_names parameter must be specified and empty. To specify only schemas, the table_names parameter must be specified and empty.


Note:

An empty array includes one NULL entry.


CREATE_INBOUND Procedure

This procedure creates an XStream inbound server and its queue.


Note:

A client application can create multiple sessions. Each session can attach to only one inbound server, and each inbound server can serve only one session at a time. However, different client application sessions can connect to different inbound servers. See Part IV, "XStream OCI API Reference" and Oracle Database XStream Java API Reference for information about attaching to an inbound server.

Syntax

DBMS_XSTREAM_ADM.CREATE_INBOUND(
   server_name IN VARCHAR2,
   queue_name  IN VARCHAR2,
   apply_user  IN VARCHAR2  DEFAULT NULL,  
   comment     IN VARCHAR2  DEFAULT NULL);

Parameters

Table 8-6 CREATE_INBOUND Procedure Parameters

ParameterDescription

server_name

The name of the inbound server being created. A NULL specification is not allowed. Do not specify an owner.

The specified name must not match the name of an existing outbound server, inbound server, apply process, or messaging client.

Note: The server_name setting cannot be altered after the inbound server is created.

queue_name

The name of the local queue used by the inbound server, specified as [schema_name.]queue_name.

If the specified queue exists, then it is used. If the specified queue does not exist, then the procedure creates it.

For example, to specify a queue named xstream_queue in the xstrmadmin schema, enter xstrmadmin.xstream_queue for this parameter. If the schema is not specified, then the current user is the default.

Note: An inbound server's queue is used only to store error transactions.

apply_user

The apply user. If NULL, then the current user is the default.

The client application must attach to the inbound server as the apply user.

The apply user is the user in whose security domain an inbound server evaluates whether LCRs satisfy its rule sets, applies DML and DDL changes directly to database objects, runs custom rule-based transformations configured for inbound server rules, and runs apply handlers configured for the inbound server. This user must have the necessary privileges to perform these actions. This procedure grants the apply user dequeue privileges on the queue used by the inbound server and configures the user as a secure queue user.

In addition to the privileges granted by this procedure, you must grant the following privileges to the apply user:

  • The necessary privileges to perform DML and DDL changes on the apply objects

  • EXECUTE privilege on the rule sets used by the inbound server

  • EXECUTE privilege on all rule-based transformation functions used in the rule set

  • EXECUTE privilege on all apply handler procedures

You can grant these privileges directly to the apply user, or you can grant them through roles.

In addition, the apply user must be granted EXECUTE privilege on all packages, including Oracle supplied packages, that are invoked in subprograms run by the inbound server. These privileges must be granted directly to the apply user. They cannot be granted through roles.

Note: If the apply user for an inbound server is dropped using DROP USER . . .  CASCADE, then the inbound server is also dropped automatically.

comment

An optional comment associated with the inbound server.


Usage Notes

By default, an inbound server does not use rules or rule sets. Therefore, an inbound server applies all of the LCRs sent to it by an XStream client application. However, to filter the LCRs sent to an inbound server, you can add rules and rule sets to an inbound server using the DBMS_STREAMS_ADM and DBMS_RULE_ADM packages.


CREATE_OUTBOUND Procedure

This procedure creates an XStream outbound server, queue, and capture process to enable client applications to stream out Oracle database changes.

This procedure is overloaded. One table_names parameter is type VARCHAR2 and the other table_names parameter is type DBMS_UTILITY.UNCL_ARRAY. Also, one schema_names parameter is type VARCHAR2 and the other schema_names parameter is type DBMS_UTILITY.UNCL_ARRAY. These parameters enable you to enter the list of tables and schemas in different ways and are mutually exclusive.


Note:

  • A client application can create multiple sessions. Each session can attach to only one outbound server, and each outbound server can serve only one session at a time. However, different client application sessions can connect to different outbound servers. See "OCIXStreamOutAttach()" and Oracle Database XStream Java API Reference for information about attaching to an outbound server.

  • If the capture_name parameter is NULL, then this procedure automatically generates a name for the capture process that it creates.

  • This procedure automatically generates a name for the queue that it creates.

  • This procedure enables both the capture process and outbound server that it creates.

  • Starting with Oracle Database 11g Release 2 (11.2.0.2), the capture_name parameter is included in this procedure.


Syntax

DBMS_XSTREAM_ADM.CREATE_OUTBOUND(
   server_name     IN VARCHAR2,
   source_database IN VARCHAR2  DEFAULT NULL,
   table_names     IN DBMS_UTILITY.UNCL_ARRAY,
   schema_names    IN DBMS_UTILITY.UNCL_ARRAY,
   capture_user    IN VARCHAR2  DEFAULT NULL,
   connect_user    IN VARCHAR2  DEFAULT NULL,
   comment         IN VARCHAR2  DEFAULT NULL,
   capture_name    IN VARCHAR2  DEFAULT NULL);

DBMS_XSTREAM_ADM.CREATE_OUTBOUND(
   server_name     IN VARCHAR2,
   source_database IN VARCHAR2  DEFAULT NULL,
   table_names     IN VARCHAR2  DEFAULT NULL,
   schema_names    IN VARCHAR2  DEFAULT NULL,
   capture_user    IN VARCHAR2  DEFAULT NULL,
   connect_user    IN VARCHAR2  DEFAULT NULL,
   comment         IN VARCHAR2  DEFAULT NULL,
   capture_name    IN VARCHAR2  DEFAULT NULL);

Parameters

Table 8-7 CREATE_OUTBOUND Procedure Parameters

ParameterDescription

server_name

The name of the outbound server being created. A NULL specification is not allowed. Do not specify an owner.

The specified name must not match the name of an existing outbound server, inbound server, apply process, or messaging client.

Note: The server_name setting cannot be altered after the outbound server is created.

source_database

The global name of the source database. The source database is where the changes to be captured originated.

If you do not include the domain name, then the procedure appends it to the database name automatically. For example, if you specify DBS1 and the domain is EXAMPLE.COM, then the procedure specifies DBS1.EXAMPLE.COM automatically.

If NULL, or if the specified name is the same as the global name of the current database, then local capture is assumed.

If non-NULL and the specified name is different from the global name of the current database, then downstream capture is assumed. In this case, configure the transmission of redo data from the source database to the downstream database before running the CREATE_OUTBOUND procedure. See Oracle Streams Replication Administrator's Guide for instructions.

table_names

The tables for which DML and DDL changes are streamed out to the XStream client application. The tables can be specified in the following ways:

  • Comma-delimited list of type VARCHAR2.

  • A PL/SQL associative array of type DBMS_UTILITY.UNCL_ARRAY, where each element is the name of a table. Specify the first table in position 1. The last position must be NULL.

Each table should be specified as [schema_name.]table_name. For example, hr.employees. If the schema is not specified, then the current user is the default.

See Also: "Usage Notes" for more information about this parameter

schema_names

The schemas for which DML and DDL changes are streamed out to the XStream client application. The schemas can be specified in the following ways:

  • Comma-delimited list of type VARCHAR2.

  • A PL/SQL associative array of type DBMS_UTILITY.UNCL_ARRAY, where each element is the name of a schema. Specify the first schema in position 1. The last position must be NULL.

Note: This procedure does not concatenate the schema_names parameter with the table_names parameter. To specify tables, enter fully qualified table names in the table_names parameter (schema_name.table_name).

See Also: "Usage Notes" for more information about this parameter

capture_user

The user in whose security domain a capture process captures changes that satisfy its rule sets and runs custom rule-based transformations configured for capture process rules. If NULL, then the current user is the default.

This procedure grants the capture user enqueue privilege on the queue used by the capture process and configures the user as a secure queue user.

In addition, ensure that the capture user has the following privileges:

  • EXECUTE privilege on the rule sets used by the capture process

  • EXECUTE privilege on all rule-based transformation functions used in the positive rule set

You can grant these privileges directly to the apply user, or you can grant them through roles.

In addition, the capture user must be granted EXECUTE privilege on all packages, including Oracle supplied packages, that are invoked in rule-based transformations run by the capture process. These privileges must be granted directly to the capture user. They cannot be granted through roles.

Only a user who is granted the DBA role can set a capture user. Only the SYS user can set the capture_user to SYS.

A capture user does not require privileges on a database object to capture changes made to it. The capture process can pass these changes to a custom rule-based transformation function. Therefore, ensure that you consider security implications when you configure a capture process.

connect_user

The user who can attach to the specified outbound server to retrieve the change stream. The client application must attach to the outbound server as the specified connect user.

If NULL, then the current user is the default.

The connect user is the user in whose security domain an outbound server dequeues LCRs that satisfy its rule sets and runs custom rule-based transformations configured for outbound server rules. This user must have the necessary privileges to perform these actions. This procedure grants the connect user dequeue privileges on the queue used by the outbound server and configures the user as a secure queue user.

In addition to the privileges granted by this procedure, grant the following privileges to the connect user:

  • EXECUTE privilege on the rule sets used by the outbound server

  • EXECUTE privilege on all rule-based transformation functions used in the rule set

You can grant these privileges directly to the connect user, or you can grant them through roles.

In addition, the connect user must be granted EXECUTE privilege on all packages, including Oracle supplied packages, that are invoked in subprograms run by the outbound server. These privileges must be granted directly to the apply user. They cannot be granted through roles.

comment

An optional comment associated with the outbound server.

capture_name

The name of the capture process configured to capture changes for the outbound server. Do not specify an owner.

The capture process must not exist. If the specified name matches the name of an existing capture process, then an error is raised.

If the name does not match the name of an existing capture process, then the procedure creates a new capture process with the specified name.

If NULL, then the system creates a new capture process with a system-generated name.

Note: The capture process name cannot be altered after the capture process is created.


Usage Notes

The following list describes the behavior of the outbound server for various combinations of the table_names and schema_names parameters:

  • If both the table_names and schema_names parameters are NULL or empty, then the outbound server streams all DML and DDL changes to the client application.

    This procedure is overloaded. The table_names and schema_names parameters are defaulted to NULL. Do not specify NULL for both table_names and schema_names in the same call; otherwise, error PLS-00307 is returned.

  • If both the table_names and schema_names parameters are specified, then the outbound server streams DML and DDL changes for the specified tables and schemas.

  • If the table_names parameter is specified and the schema_names parameter is NULL or empty, then the outbound server streams DML and DDL changes for the specified tables.

  • If the table_names parameter is NULL or empty and the schema_names parameter is specified, then the outbound server streams DML and DDL changes for the specified schema.

For the procedure that uses the DBMS_UTILITY.UNCL_ARRAY type for the table_names and schema_names parameters, both parameters must be specified. To specify only tables, the schema_names parameter must be specified and empty. To specify only schemas, the table_names parameter must be specified and empty.


Note:

An empty array includes one NULL entry.


DROP_INBOUND Procedure

This procedure removes an inbound server configuration.

This procedure always removes the specified inbound server. This procedure also removes the queue for the inbound server if all of the following conditions are met:

  • One call to the CREATE_INBOUND procedure created the queue.

  • The inbound server is the only subscriber to the queue.

Syntax

DBMS_XSTREAM_ADM.DROP_INBOUND(
   server_name IN VARCHAR2);

Parameters

Table 8-8 DROP_INBOUND Procedure Parameters

ParameterDescription

server_name

The name of the inbound server being removed. Specify an existing inbound server. Do not specify an owner.



DROP_OUTBOUND Procedure

This procedure removes an outbound server configuration.

This procedure always drops the specified outbound server. This procedure also drops the queue used by the outbound server if both of the following conditions are met:

  • The queue was created by the CREATE_OUTBOUND procedure in this package.

  • The outbound server is the only subscriber to the queue.

If either one of the preceding conditions is not met, then the DROP_OUTBOUND procedure only drops the outbound server. It does not drop the queue.

This procedure also drops the capture process for the outbound server if both of the following conditions are met:

  • The procedure can drop the outbound server's queue.

  • The capture process was created by the CREATE_OUTBOUND procedure.

If the procedure can drop the queue but cannot manage the capture process, then it drops the queue without dropping the capture process.

Syntax

DBMS_XSTREAM_ADM.DROP_OUTBOUND(
   server_name IN VARCHAR2);

Parameters

Table 8-9 DROP_OUTBOUND Procedure Parameters

ParameterDescription

server_name

The name of the outbound server being removed. Specify an existing outbound server. Do not specify an owner.



ENABLE_GG_XSTREAM_FOR_STREAMS Procedure


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

This procedure enables XStream capabilities and performance optimizations for Oracle Streams components.

This procedure is intended for users of Oracle Streams who want to enable XStream capabilities and optimizations. For example, you can enable the optimizations for an Oracle Streams replication configuration that uses capture processes and apply processes to replicate changes between Oracle databases.

These capabilities and optimizations are enabled automatically for XStream components, such as outbound servers, inbound servers, and capture processes that send changes to outbound servers. It is not necessary to run this procedure for XStream components.

When XStream capabilities are enabled, Oracle Streams components can stream ID key LCRs and sequence LCRs. The XStream performance optimizations improve efficiency in various areas, including:

  • LCR processing

  • Handling large transactions

  • DML execution during apply

  • Dependency computation and scheduling

  • Capture process parallelism

Syntax

DBMS_XSTREAM_ADM.ENABLE_GG_XSTREAM_FOR_STREAMS(
   enable IN BOOLEAN  TRUE);

Parameters

Table 8-10 ENABLE_GG_XSTREAM_FOR_STREAMS Procedure Parameters

ParameterDescription

enable

If TRUE, then enable XStream performance optimizations for Oracle Streams components.

If FALSE, then disable XStream performance optimizations for Oracle Streams components.


Usage Notes

The following usage notes apply to this procedure:

  • When you run this procedure, all capture processes and apply processes are restarted.

  • After you run this procedure, the PURPOSE column in the following views displays XStream Streams:

    • ALL_APPLY

    • DBA_APPLY

    • ALL_CAPTURE

    • DBA_CAPTURE

  • A license for the Oracle GoldenGate product is required to enable XStream performance optimizations for Oracle Streams components.


IS_GG_XSTREAM_FOR_STREAMS Function


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

This function returns TRUE if XStream performance optimizations are enabled for Oracle Streams components, or this function returns FALSE if XStream performance optimizations are disabled for Oracle Streams components.

Syntax

DBMS_XSTREAM_ADM.IS_GG_XSTREAM_FOR_STREAMS
RETURN BOOLEAN;

REMOVE_SUBSET_OUTBOUND_RULES Procedure

This procedure removes subset rules from an outbound server configuration.

The names of the specified insert, update, and delete rules must match those generated by the ADD_SUBSET_OUTBOUND_RULES procedure. To view the rule names for subset rules, run the following query:

SELECT RULE_OWNER, SUBSETTING_OPERATION, RULE_NAME 
   FROM DBA_XSTREAM_RULES 
   WHERE SUBSETTING_OPERATION IS NOT NULL;

Note:

  • This procedure removes the declarative rule-based transformation associated with each rule it removes.

  • This procedure does not remove rules from the outbound server's capture process.


Syntax

DBMS_XSTREAM_ADM.REMOVE_SUBSET_OUTBOUND_RULES(
   server_name      IN VARCHAR2,
   insert_rule_name IN VARCHAR2, 
   update_rule_name IN VARCHAR2, 
   delete_rule_name IN VARCHAR2);

Parameters

Table 8-11 REMOVE_SUBSET_OUTBOUND_RULES Procedure Parameters

ParameterDescription

server_name

The name of the outbound server from which rules are being removed. Specify an existing outbound server. Do not specify an owner.

insert_rule_name

The name of the insert rule being removed, specified as [schema_name.]rule_name.

For example, to specify a rule in the hr schema named rule1, enter hr.rule1. If the schema is not specified, then the current user is the default.

If NULL, then the procedure raises an error.

update_rule_name

The name of the update rule being removed, specified as [schema_name.]rule_name.

If NULL, then the procedure raises an error.

delete_rule_name

The name of the delete rule being removed, specified as [schema_name.]rule_name.

If NULL, then the procedure raises an error.


PKP"hhPK"8AOEBPS/xstrm_static_views.htm XStream Static Data Dictionary Views

12 XStream Static Data Dictionary Views

This chapter describes the static data dictionary views related to XStream.

This chapter contains these topics:

ALL_APPLY

ALL_APPLY displays information about the apply processes that dequeue messages from queues accessible to the current user.

Related View

DBA_APPLY displays information about all apply processes in the database.

ColumnData TypeNULLDescription
APPLY_NAMEVARCHAR2(30)NOT NULLName of the apply process
QUEUE_NAMEVARCHAR2(30)NOT NULLName of the queue from which the apply process dequeues
QUEUE_OWNERVARCHAR2(30)NOT NULLOwner of the queue from which the apply process dequeues
APPLY_CAPTUREDVARCHAR2(3)Indicates whether the apply process applies captured messages (YES) or user-enqueued messages (NO)
RULE_SET_NAMEVARCHAR2(30)Name of the positive rule set used by the apply process for filtering
RULE_SET_OWNERVARCHAR2(30)Owner of the positive rule set used by the apply process for filtering
APPLY_USERVARCHAR2(30)User who is applying messages
APPLY_DATABASE_LINKVARCHAR2(128)Database link to which changes are applied. If NULL, then changes are applied to the local database.
APPLY_TAGRAW(2000)Tag associated with redo log records that are generated when changes are made by the apply process
DDL_HANDLERVARCHAR2(98)Name of the user-specified data definition language (DDL) handler, which handles DDL logical change records (LCRs)
PRECOMMIT_HANDLERVARCHAR2(98)Name of the user-specified pre-commit handler
MESSAGE_HANDLERVARCHAR2(98)Name of the user-specified procedure that handles dequeued messages other than LCRs
STATUSVARCHAR2(8)Status of the apply process:
  • DISABLED

  • ENABLED

  • ABORTED

MAX_APPLIED_MESSAGE_NUMBERNUMBERSystem change number (SCN) corresponding to the apply process high watermark for the last time the apply process was stopped using the DBMS_APPLY_ADM.STOP_APPLY procedure with the force parameter set to false. The apply process high watermark is the SCN beyond which no messages have been applied.
NEGATIVE_RULE_SET_NAMEVARCHAR2(30)Name of the negative rule set used by the apply process for filtering
NEGATIVE_RULE_SET_OWNERVARCHAR2(30)Owner of the negative rule set used by the apply process for filtering
STATUS_CHANGE_TIMEDATETime that the STATUS of the apply process was changed
ERROR_NUMBERNUMBERError number if the apply process was aborted
ERROR_MESSAGEVARCHAR2(4000)Error message if the apply process was aborted
MESSAGE_DELIVERY_MODEVARCHAR2(10)Reserved for internal use
PURPOSEVARCHAR2(19)Purpose of the apply process:
  • Streams - An apply process in an Oracle Streams configuration

  • XStream Streams - An apply process in an Oracle Streams configuration with XStream capabilities enabled by the DBMS_XSTREAM_ADM.ENABLE_GG_XSTREAM_FOR_STREAMS procedure

  • XStream Out - An XStream outbound server in an XStream Out configuration

  • XStream In - An XStream inbound server in an XStream In configuration

  • AUDIT VAULT - An apply process in an audit vault configuration

  • CHANGE DATA CAPTURE - An apply process in a change data capture configuration



See Also:

"DBA_APPLY"

ALL_APPLY_ERROR

ALL_APPLY_ERROR displays information about the error transactions generated by the apply processes that dequeue messages from queues accessible to the current user.


Note:

Starting with Oracle Database 11g Release 2 (11.2.0.2), the ERROR_TYPE column is included in this view.

Related View

DBA_APPLY_ERROR displays information about the error transactions generated by all apply processes in the database.

ColumnData TypeNULLDescription
APPLY_NAMEVARCHAR2(30)Name of the apply process at the local database which processed the transaction
QUEUE_NAMEVARCHAR2(30)Name of the queue at the local database from which the transaction was dequeued
QUEUE_OWNERVARCHAR2(30)Owner of the queue at the local database from which the transaction was dequeued
LOCAL_TRANSACTION_IDVARCHAR2(22)Local transaction ID for the error transaction
SOURCE_DATABASEVARCHAR2(128)Database where the transaction originated
SOURCE_TRANSACTION_IDVARCHAR2(128)Original transaction ID at the source database
SOURCE_COMMIT_SCNNUMBEROriginal commit SCN for the transaction at the source database
MESSAGE_NUMBERNUMBERIdentifier for the message in the transaction that raised an error
ERROR_NUMBERNUMBERError number of the error raised by the transaction
ERROR_MESSAGEVARCHAR2(4000)Error message of the error raised by the transaction
RECIPIENT_IDNUMBERUser ID of the original user that applied the transaction
RECIPIENT_NAMEVARCHAR2(30)Name of the original user that applied the transaction
MESSAGE_COUNTNUMBERTotal number of messages inside the error transaction
ERROR_CREATION_TIMEDATETime that the error was created
SOURCE_COMMIT_POSITIONRAW(64)Original commit position for the transaction
ERROR_TYPEVARCHAR2(11)NULL if the apply process can access all of the LCRs in the error transaction. When the ERROR_TYPE is NULL, manage the error transactions using the instructions in Oracle Streams Concepts and Administration.

EAGER ERROR if the apply process cannot access all of the LCRs in the error transaction. This error type typically means that the apply process was applying LCRs in a large transaction. When the ERROR_TYPE is EAGER ERROR, manage the error transaction using the instructions in "Managing Eager Errors Encountered by an Inbound Server".



See Also:

"DBA_APPLY_ERROR"

ALL_APPLY_ERROR_MESSAGES


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

ALL_APPLY_ERROR_MESSAGES displays information about the individual messages in an error transaction generated by the apply processes that dequeue messages from queues accessible to the current user.

For XStream inbound servers, each message in an error transaction is an LCR.


Note:

  • Messages that were spilled from memory to hard disk do not appear in this view.

  • This view does not contain information related to XStream outbound servers.


RELATED VIEW

DBA_APPLY_ERROR_MESSAGES displays information about the individual messages in all of the error transactions generated by all apply processes in the database.

ColumnData TypeNULLDescription
MESSAGE_IDRAW(16)
Unique identifier of the message stored in the error queue
LOCAL_TRANSACTION_IDVARCHAR2(22)
Local transaction ID for the error transaction
TRANSACTION_MESSAGE_NUMBERNUMBER
Message number of the message that raised the error

The message number is a sequence number for the messages in the transaction, starting with 1.

ERROR_NUMBERNUMBER
Error number of the error raised by the transaction

The error number is populated only for the LCR that raised the error. This field is NULL for the other LCRs in the transaction.

ERROR_MESSAGEVARCHAR2(4000)
Error message of the error raised by the transaction

The error message is populated only for the LCR that raised the error. This field is NULL for the other LCRs in the transaction.


ALL_CAPTURE

ALL_CAPTURE displays information about the capture processes that enqueue the captured changes into queues accessible to the current user.


Note:

Starting with Oracle Database 11g Release 2 (11.2.0.2), the START_TIME and PURPOSE columns are included in this view.

RELATED VIEW

DBA_CAPTURE displays information about all capture processes in the database.

ColumnData TypeNULLDescription
CAPTURE_NAMEVARCHAR2(30)NOT NULLName of the capture process
QUEUE_NAMEVARCHAR2(30)NOT NULLName of the queue used for staging captured changes
QUEUE_OWNERVARCHAR2(30)NOT NULLOwner of the queue used for staging captured changes
RULE_SET_NAMEVARCHAR2(30)Name of the positive rule set used by the capture process for filtering
RULE_SET_OWNERVARCHAR2(30)Owner of the positive rule set
CAPTURE_USERVARCHAR2(30)Current user who is enqueuing captured messages
START_SCNNUMBERSCN from which the capture process will start to capture changes
STATUSVARCHAR2(8)Status of the capture process:
  • DISABLED

  • ENABLED

  • ABORTED

CAPTURED_SCNNUMBERSCN of the last redo log record scanned
APPLIED_SCNNUMBERSCN of the most recent message dequeued by the relevant apply processes. All changes below this SCN have been dequeued by all apply processes that apply changes captured by this capture process.
USE_DATABASE_LINKVARCHAR2(3)Indicates whether the source database name is used as the database link to connect to the source database from the downstream database (YES) or not (NO). If the capture process was created at the source database, then this column will be NULL.
FIRST_SCNNUMBERSCN from which the capture process can be restarted
SOURCE_DATABASEVARCHAR2(128)Global name of the source database
SOURCE_DBIDNUMBERDatabase ID of the source database
SOURCE_RESETLOGS_SCNNUMBERResetlogs SCN of the source database
SOURCE_RESETLOGS_TIMENUMBERResetlogs time of the source database
LOGMINER_IDNUMBERSession ID of the Oracle LogMiner session associated with the capture process
NEGATIVE_RULE_SET_NAMEVARCHAR2(30)Name of the negative rule set used by the capture process for filtering
NEGATIVE_RULE_SET_OWNERVARCHAR2(30)Owner of the negative rule set used by the capture process for filtering
MAX_CHECKPOINT_SCNNUMBERSCN at which the last checkpoint was taken by the capture process
REQUIRED_CHECKPOINT_SCNNUMBERLowest SCN for which the capture process requires redo information to restart

Note: This SCN value does not necessarily correspond with a checkpoint SCN value.

LOGFILE_ASSIGNMENTVARCHAR2(8)Logfile assignment type for the capture process:
  • IMPLICIT

  • EXPLICIT

STATUS_CHANGE_TIMEDATETime that the status of the capture process was changed
ERROR_NUMBERNUMBERError number if the capture process was aborted
ERROR_MESSAGEVARCHAR2(4000)Error message if the capture process was aborted
VERSIONVARCHAR2(64)Version number of the capture process
CAPTURE_TYPEVARCHAR2(10)Type of the capture process:
  • DOWNSTREAM

  • LOCAL

LAST_ENQUEUED_SCNNUMBERLast enqueued SCN
CHECKPOINT_RETENTION_TIMENUMBERCheckpoint retention time

Note: When the checkpoint retention time for a capture process is set to INFINITE, then the value displayed in this column is 4294967295.

START_TIMETIMESTAMP(6)
Time from which the capture process will start to capture changes
PURPOSEVARCHAR2(19)
Purpose of the capture process:
  • Streams - A capture process in an Oracle Streams configuration

  • XStream Streams - A capture process in an Oracle Streams configuration with XStream capabilities enabled by the DBMS_XSTREAM_ADM.ENABLE_GG_XSTREAM_FOR_STREAMS procedure

  • XStream Out - A capture process in an XStream Out configuration

  • AUDIT VAULT - A capture process in an audit vault configuration

  • CHANGE DATA CAPTURE - A capture process in a change data capture configuration



See Also:

"DBA_CAPTURE"

ALL_XSTREAM_INBOUND

ALL_XSTREAM_INBOUND displays information about the XStream inbound servers accessible to the current user.


Note:

Starting with Oracle Database 11g Release 2 (11.2.0.2), the STATUS and COMMITTED_DATA_ONLY columns are included in this view.

Related View

DBA_XSTREAM_INBOUND displays information about all XStream inbound servers in the database.

ColumnData TypeNULLDescription
SERVER_NAMEVARCHAR2(30)NOT NULLName of the inbound server
QUEUE_OWNERVARCHAR2(30)NOT NULLOwner of the queue associated with the inbound server
QUEUE_NAMEVARCHAR2(30)NOT NULLName of the queue associated with the inbound server
APPLY_USERVARCHAR2(30)Name of the user who can connect to the inbound server and apply messages
USER_COMMENTVARCHAR2(4000)User comment
CREATE_DATETIMESTAMP(6)Date when the inbound server was created
STATUSVARCHAR2(8)
Status of the inbound server:
  • DISABLED - The inbound server is not running.

  • DETACHED - The inbound server is running, but the XStream client application is not attached to it.

  • ATTACHED - The inbound server is running, and the XStream client application is attached to it.

  • ABORTED - The inbound server became disabled because it encountered an error.

COMMITTED_DATA_ONLYVARCHAR2(3)
YES if the inbound server can receive only LCRs in committed transactions from the XStream client application. A committed transaction is an assembled, noninterleaving transaction with no rollbacks.

NO if the inbound server can receive LCRs in transactions that have not yet committed. This mode is for internal Oracle use only.


ALL_XSTREAM_INBOUND_PROGRESS

ALL_XSTREAM_INBOUND_PROGRESS displays information about the progress made by the XStream inbound servers accessible to the current user.


Note:

Starting with Oracle Database 11g Release 2 (11.2.0.2), the OLDEST_POSITION, OLDEST_MESSAGE_NUMBER, APPLIED_MESSAGE_NUMBER, APPLIED_TIME, APPLIED_MESSAGE_CREATE_TIME, SPILL_MESSAGE_NUMBER, and SOURCE_DATABASE columns are included in this view.

Related View

DBA_XSTREAM_INBOUND_PROGRESS displays information about the progress made by all XStream inbound servers in the database.

ColumnData TypeNULLDescription
SERVER_NAMEVARCHAR2(30)NOT NULLName of the inbound server
PROCESSED_LOW_POSITIONRAW(64)Position of the processed low transaction
APPLIED_LOW_POSITIONRAW(64)All messages with a commit position less than this value have been applied
APPLIED_HIGH_POSITIONRAW(64)Highest commit position of a transaction that has been applied
SPILL_POSITIONRAW(64)Position of the spill low watermark of the transactions currently being applied
OLDEST_POSITIONRAW(64)Earliest position of the transactions currently being applied
OLDEST_MESSAGE_NUMBERNUMBERNOT NULLEarliest message number of the transactions currently being applied
APPLIED_MESSAGE_NUMBERNUMBERNOT NULLMessage number up to which all transactions have definitely been applied. This value is the low watermark for the inbound server. That is, messages with a commit message number less than or equal to this message number have definitely been applied, but some messages with a higher commit message number may also have been applied.
APPLIED_TIMEDATETime at which the message with the message number displayed in the APPLIED_MESSAGE_NUMBER column was applied
APPLIED_MESSAGE_CREATE_TIMEDATETime at which the message with the message number displayed in the APPLIED_MESSAGE_NUMBER column was created at its source database
SPILL_MESSAGE_NUMBERNUMBERSpill low watermark. Any message with a lower SCN has either been applied or spilled to disk. The XStream client application does not need to send LCRs with a lower SCN than the spill low watermark. Spilled messages may not have been applied yet.
SOURCE_DATABASEVARCHAR2(128)NOT NULLDatabase where the transaction originated

ALL_XSTREAM_OUTBOUND

ALL_XSTREAM_OUTBOUND displays information about the XStream outbound servers accessible to the current user.


Note:

Starting with Oracle Database 11g Release 2 (11.2.0.2), the STATUS, COMMITTED_DATA_ONLY, START_SCN, and START_TIME columns are included in this view.

Related View

DBA_XSTREAM_OUTBOUND displays information about all XStream outbound servers in the database.

ColumnData TypeNULLDescription
SERVER_NAMEVARCHAR2(30)NOT NULLName of the outbound server
CONNECT_USERVARCHAR2(30)Name of the user who can connect to the outbound server and process the outbound LCRs
CAPTURE_NAMEVARCHAR2(30)Name of the Streams capture process
SOURCE_DATABASEVARCHAR2(128)Database where the transaction originated
CAPTURE_USERVARCHAR2(30)Current user who is enqueuing captured messages
QUEUE_OWNERVARCHAR2(30)NOT NULLOwner of the queue associated with the outbound server
QUEUE_NAMEVARCHAR2(30)NOT NULLName of the queue associated with the outbound server
USER_COMMENTVARCHAR2(4000)User comment
CREATE_DATETIMESTAMP(6)Date when the outbound server was created
STATUSVARCHAR2(8)Status of the outbound server:
  • DISABLED - The outbound server is not running.

  • DETACHED - The outbound server is running, but the XStream client application is not attached to it.

  • ATTACHED - The outbound server is running, and the XStream client application is attached to it.

  • ABORTED - The outbound server became disabled because it encountered an error.

COMMITTED_DATA_ONLYVARCHAR2(3)YES if the outbound server can send only LCRs in committed transactions to the XStream client application. A committed transaction is an assembled, noninterleaving transaction with no rollbacks.

NO if the outbound server can send LCRs in transactions that have not yet committed to the XStream client application. This mode is for internal Oracle use only.

START_SCNNUMBERThe SCN from which the outbound server's capture process started capturing changes when it was last started
START_TIMETIMESTAMP(6)The time from which the outbound server's capture process started capturing changes when it was last started

ALL_XSTREAM_OUTBOUND_PROGRESS

ALL_XSTREAM_OUTBOUND_PROGRESS displays information about the progress made by the XStream outbound servers accessible to the current user.


Note:

Starting with Oracle Database 11g Release 2 (11.2.0.2), the OLDEST_POSITION column is included in this view.

Related View

DBA_XSTREAM_OUTBOUND_PROGRESS displays information about the progress made by all XStream outbound servers in the database.

ColumnData TypeNULLDescription
SERVER_NAMEVARCHAR2(30)NOT NULLName of the outbound server
SOURCE_DATABASEVARCHAR2(128)Database where the transaction originated
PROCESSED_LOW_POSITIONRAW(64)Position of the low watermark transaction processed by the outbound server
PROCESSED_LOW_TIMEDATETime when the processed low position was last updated by the outbound server
OLDEST_POSITIONRAW(64)
The position of the earliest LCR that is required by the XStream client application

ALL_XSTREAM_RULES

ALL_XSTREAM_RULES displays information about the XStream rules accessible to the current user.

Related View

DBA_XSTREAM_RULES displays information about all XStream server rules in the database.

ColumnData TypeNULLDescription
STREAMS_NAMEVARCHAR2(30)Name of the Streams process
STREAMS_TYPEVARCHAR2(12)Type of the Streams process:
  • CAPTURE

  • APPLY

STREAMS_RULE_TYPEVARCHAR2(6)The Streams type of the rule:
  • TABLE

  • SCHEMA

  • GLOBAL

RULE_SET_OWNERVARCHAR2(30)Owner of the rule set
RULE_SET_NAMEVARCHAR2(30)Name of the rule set
RULE_SET_TYPECHAR(8)Type of the rule set:
  • POSITIVE

  • NEGATIVE

RULE_OWNERVARCHAR2(30)NOT NULLOwner of the rule
RULE_NAMEVARCHAR2(30)NOT NULLName of the rule
RULE_TYPEVARCHAR2(3)The type of the rule:
  • DML

  • DDL

RULE_CONDITIONCLOBCurrent rule condition
SCHEMA_NAMEVARCHAR2(30)For table and schema rules, the schema name
OBJECT_NAMEVARCHAR2(30)For table rules, the table name
INCLUDE_TAGGED_LCRVARCHAR2(3)Indicates whether to include tagged LCRs (YES) or not (NO)
SUBSETTING_OPERATIONVARCHAR2(6)For subset rules, the type of operation:
  • INSERT

  • UPDATE

  • DELETE

DML_CONDITIONVARCHAR2(4000)For subset rules, the row subsetting condition
SOURCE_DATABASEVARCHAR2(128)The name of the database where the LCRs originated
ORIGINAL_RULE_CONDITIONVARCHAR2(4000)For rules created by Streams administrative APIs, the original rule condition when the rule was created
SAME_RULE_CONDITIONVARCHAR2(3)For rules created by Streams administrative APIs, indicates whether the current rule condition is the same as the original rule condition (YES) or not (NO)

DBA_APPLY

DBA_APPLY displays information about all apply processes in the database. Its columns are the same as those in ALL_APPLY.


See Also:

"ALL_APPLY"

DBA_APPLY_ERROR

DBA_APPLY_ERROR displays information about the error transactions generated by all apply processes in the database. Its columns are the same as those in ALL_APPLY_ERROR.


Note:

Starting with Oracle Database 11g Release 2 (11.2.0.2), the ERROR_TYPE column is included in this view.


See Also:

"ALL_APPLY_ERROR"

DBA_APPLY_ERROR_MESSAGES


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

DBA_APPLY_ERROR_MESSAGES displays information about the individual messages in all of the error transactions generated by all apply processes in the database. Its columns are the same as those in ALL_APPLY_ERROR_MESSAGES.

For XStream inbound servers, each message in an error transaction is an LCR.


Note:

  • Messages that were spilled from memory to hard disk do not appear in this view.

  • This view does not contain information related to XStream outbound servers.


DBA_APPLY_SPILL_TXN

DBA_APPLY_SPILL_TXN displays information about the transactions spilled from memory to hard disk by all apply processes in the database.

ColumnData TypeNULLDescription
APPLY_NAMEVARCHAR2(30)NOT NULLName of the apply process that spilled one or more transactions
XIDUSNNUMBERNOT NULLTransaction ID undo segment number
XIDSLTNUMBERNOT NULLTransaction ID slot number
XIDSQNNUMBERNOT NULLTransaction ID sequence number
FIRST_SCNNUMBERNOT NULLSCN of the first message in the transaction
MESSAGE_COUNTNUMBERNumber of messages spilled for the transaction
FIRST_MESSAGE_CREATE_TIMEDATESource creation time of the first message in the transaction
SPILL_CREATION_TIMEDATETime the first message was spilled
FIRST_POSITIONRAW(64)Position of the first message in this transaction

This column is populated only for an XStream inbound server.

TRANSACTION_IDVARCHAR2(128)Transaction ID of the spilled transaction

DBA_CAPTURE

DBA_CAPTURE displays information about all capture processes in the database. Its columns are the same as those in ALL_CAPTURE.


Note:

Starting with Oracle Database 11g Release 2 (11.2.0.2), the START_TIME and PURPOSE columns are included in this view.


See Also:

"ALL_CAPTURE"

DBA_XSTREAM_ADMINISTRATOR


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

DBA_XSTREAM_ADMINISTRATOR displays information about the users who have been granted privileges to be XStream administrators by procedures in the DBMS_XSTREAM_AUTH package.

ColumnData TypeNULLDescription
USERNAMEVARCHAR2(30)NOT NULLName of the user who has been granted privileges to be an XStream administrator
LOCAL_PRIVILEGESVARCHAR2(3)
Indicates whether the user has been granted local XStream administrator privileges (YES) or not (NO)
ACCESS_FROM_REMOTEVARCHAR2(3)
Indicates whether the user can be used for remote XStream administration through a database link (YES) or not (NO)

DBA_XSTREAM_INBOUND

DBA_XSTREAM_INBOUND displays information about all XStream inbound servers in the database. Its columns are the same as those in ALL_XSTREAM_INBOUND.


Note:

Starting with Oracle Database 11g Release 2 (11.2.0.2), the STATUS and COMMITTED_DATA_ONLY columns are included in this view.

DBA_XSTREAM_INBOUND_PROGRESS

DBA_XSTREAM_INBOUND_PROGRESS displays information about the progress made by all XStream inbound servers in the database. Its columns are the same as those in ALL_XSTREAM_INBOUND_PROGRESS.


Note:

Starting with Oracle Database 11g Release 2 (11.2.0.2), the OLDEST_POSITION, OLDEST_MESSAGE_NUMBER, APPLIED_MESSAGE_NUMBER, APPLIED_TIME, APPLIED_MESSAGE_CREATE_TIME, SPILL_MESSAGE_NUMBER, and SOURCE_DATABASE columns are included in this view.

DBA_XSTREAM_OUT_SUPPORT_MODE


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

DBA_XSTREAM_OUT_SUPPORT_MODE displays information about the level of capture process support for the tables in the database.

ColumnData TypeNULLDescription
OWNERVARCHAR2(30)
Table owner
OBJECT_NAMEVARCHAR2(30)
Table name
SUPPORT_MODEVARCHAR2(6)
Capture process support level for the table:
  • FULL - A capture process can capture changes made to all of the columns in the table.

  • ID KEY - A capture process can capture changes made to the key columns and any other columns in the table that are supported by the capture process, except for LOB, LONG, LONG RAW, and XMLType columns.

  • NONE - A capture process cannot capture changes made to any columns in the table.


DBA_XSTREAM_OUTBOUND

DBA_XSTREAM_OUTBOUND displays information about all XStream outbound servers in the database. Its columns are the same as those in ALL_XSTREAM_OUTBOUND.


Note:

Starting with Oracle Database 11g Release 2 (11.2.0.2), the STATUS, COMMITTED_DATA_ONLY, START_SCN, and START_TIME columns are included in this view.

DBA_XSTREAM_OUTBOUND_PROGRESS

DBA_XSTREAM_OUTBOUND_PROGRESS displays information about the progress made by all XStream outbound servers in the database. Its columns are the same as those in ALL_XSTREAM_OUTBOUND_PROGRESS.


Note:

Starting with Oracle Database 11g Release 2 (11.2.0.2), the OLDEST_POSITION column is included in this view.

DBA_XSTREAM_RULES

DBA_XSTREAM_RULES displays information about all XStream rules in the database. Its columns are the same as those in ALL_XSTREAM_RULES.

PKzPK"8AOEBPS/xstrm_oci_intro.htmS1 Introduction to the OCI Interface for XStream

10 Introduction to the OCI Interface for XStream

The Oracle Call Interface (OCI) includes an interface for XStream. This chapter provides an introduction to the OCI interface for XStream.

This chapter contains these topics:

This chapter provides an overview of the OCI interface for XStream. For detailed information about XStream concepts, see Chapter 2, "XStream Concepts".

About the XStream Interface

Since Oracle Database 11g Release 2, APIs, known as XStream Out and XStream In, are available. This technology enables high performance, near real-time information-sharing infrastructure between Oracle databases and non-Oracle databases, non-RDBMS Oracle products, file systems, third party software applications, and so on. XStream is built on top of Oracle Streams infrastructure.

XStream Out

XStream Out allows a remote client to attach to an outbound server and extract row changes in the form of logical change records (LCRs). For the basics of LCRs, see Oracle Streams Concepts and Administration.

To use XStream Out, a capture process and an outbound server must be created. All data types supported by Oracle Streams, including LOB, LONG, and XMLType, are supported by XStream. The capture process and the outbound server need not be on the same database instance. After the capture process and the outbound server have started, row changes are captured and sent to the outbound server. An external client application can connect to this outbound server using OCI. After the connection is established, the client application can loop while waiting for LCRs from the outbound server. The client application can register a client-side callback to be invoked each time an LCR is received. At any time, the client application can detach from the outbound server as needed. Upon restart, the outbound server knows where in the redo stream to start streaming LCRs to the client application.


See Also:

"XStream Out"

XStream In

To replicate non-Oracle data into Oracle databases, use XStream In. This technology allows a remote client application to attach to an inbound server and send row and DDL changes in the form of LCRs.

An external client application connects to the inbound server using OCI. After the connection is established, the client application acts as the capture agent for the inbound server by streaming LCRs to it. A client application can attach to only one inbound server for each database connection, and each inbound server only allows one client application to attach to it.


See Also:

"XStream In"

Position Order and LCR Streams

Each LCR has a position attribute. The position of an LCR identifies its placement in the stream of LCRs in a transaction.

XStream and Character Sets

XStream Out implicitly converts character data in LCRs from the outbound server database character set to the client application character set. XStream In implicitly converts character data in LCRs from the client application character set to the inbound server database character set.

To improve performance, complete the following tasks:

  • Analyze the LCR data flow from the source to the destination.

  • Set the client character set of the OCI client application to the one that minimizes character conversion, incurs no data loss, and takes advantage of the implicit conversion done by XStream or the destination.

For XStream Out, in general, setting the client application character set to the outbound server database character set is the best practice.

Handler and Descriptor Attributes

This chapter describes the attributes for OCI handles and descriptors, which can be read with OCIAttrGet() and modified with OCIAttrSet().

Conventions

For each handle type, the attributes that can be read or changed are listed. Each attribute listing includes the following information:

Mode

The following modes are valid:

READ - The attribute can be read using OCIAttrGet().

WRITE - The attribute can be modified using OCIAttrSet().

READ/WRITE - The attribute can be read using OCIAttrGet(), and it can be modified using OCIAttrSet().

Description

This is a description of the purpose of the attribute.

Attribute Data Type

This is the data type of the attribute. If necessary, a distinction is made between the data type for READ and WRITE modes.

Server Handle Attributes

The following server handle attributes are available:

OCI_ATTR_XSTREAM_ACK_INTERVAL

Mode

READ/WRITE

Description

For XStream Out, the ACK interval is the minimum interval in seconds that the outbound server receives the processed low position from the client application. After each ACK interval, the outbound server ends any in-progress OCIXStreamOutLCRReceive() or OCIXStreamOutLCRCallbackReceive() call so that the processed low position cached at the client application can be sent to the outbound server.

For XStream In, the ACK interval is the minimum interval in seconds that the inbound server sends the processed low position to the client application. After each ACK interval, any in-progress OCIXStreamInLCRSend() or OCIXStreamInLCRCallbackSend() call is terminated for the inbound server to send a new processed low position to the client application.

The default value for OCI_ATTR_XSTREAM_ACK_INTERVAL is 30 seconds. This attribute is checked only during the OCIXStreamOutAttach() or OCIXStreamInAttach() calls. Thus, it must be set before invoking these APIs; otherwise, the default value is used.

Attribute Data Type

ub4 */ub4

OCI_ATTR_XSTREAM_IDLE_TIMEOUT

Mode

READ/WRITE

Description

The idle timeout is the number of seconds of idle the outbound server waits for an LCR before terminating the OCIXStreamOutLCRReceive() or OCIXStreamOutLCRCallbackReceive() call.

The default for OCI_ATTR_XSTREAM_IDLE_TIMEOUT is one second. This attribute is checked only during the OCIXStreamOutAttach() or OCIXStreamInAttach() call. Thus, it must be set before invoking these APIs; otherwise, the default value is used.

Attribute Data Type

ub4 */ub4

PK Oracle® Database XStream Guide, 11g Release 2 (11.2) Cover Table of Contents Oracle Database XStream Guide, 11g Release 2 (11.2) Preface XStream Concepts and Use Cases Introduction to XStream XStream Concepts XStream Use Cases XStream Administration Configuring XStream Managing XStream Monitoring XStream Troubleshooting XStream XStream PL/SQL Packages Reference DBMS_XSTREAM_ADM DBMS_XSTREAM_AUTH XStream OCI API Reference Introduction to the OCI Interface for XStream OCI XStream Functions XStream Data Dictionary Views XStream Static Data Dictionary Views XStream Dynamic Performance (V$) Views Index Copyright PKؒPK"8AOEBPS/xstrm_pt_plsql.htmS XStream PL/SQL Packages Reference

Part III

XStream PL/SQL Packages Reference

This part contains the XStream PL/SQL packages reference. This part contains the following chapters:

PKt2XSPK"8AOEBPS/content.opf.m Oracle® Database XStream Guide, 11g Release 2 (11.2) en-US E16545-07 Oracle Corporation Oracle Corporation Oracle® Database XStream Guide, 11g Release 2 (11.2) 2011-07-29T10:24:20Z Contains conceptual information and reference information about XStream. Also contains instructions for using XStream. The reference information includes descriptions of the OCI API for XStream, PL/SQL packages related to XStream, and data dictionary views related to XStream. PKg=J..PK"8AOEBPS/dcommon/prodbig.gif GIF87a!!!)))111BBBZZZsss{{ZRRcZZ!!1!91)JB9B9)kkcJJB991ssc絽Zcc!!{祽BZc!9B!c{!)c{9{Z{{cZB1)sJk{{Z{kBsZJ91)Z{!{BcsRsBc{9ZZk甽kBkR!BZ9c)JJc{!))BZks{BcR{JsBk9k)Zck!!BZ1k!ZcRBZcZJkBk1Z9c!R!c9kZRZRBZ9{99!R1{99R{1!1)c1J)1B!BJRkk{ƽ絵ތkk絵RRs{{{{JJsssBBkkk!!9ss{{ZZssccJJZZRRccRRZZ))cBBJJ99JJ!!c11991199Z11!c!!))Z!!!1BRck{)!cJBkZRZ,HP)XRÇEZ֬4jJ0 @ "8pYҴESY3CƊ@*U:lY0_0#  5tX1E: C_xޘeKTV%ȣOΏ9??:a"\fSrğjAsKJ:nOzO=}E1-I)3(QEQEQEQEQEQEQE֝Hza<["2"pO#f8M[RL(,?g93QSZ uy"lx4h`O!LŏʨXZvq& c՚]+: ǵ@+J]tQ]~[[eϸ (]6A&>ܫ~+כzmZ^(<57KsHf妬Ϧmnẁ&F!:-`b\/(tF*Bֳ ~V{WxxfCnMvF=;5_,6%S>}cQQjsOO5=)Ot [W9 /{^tyNg#ЄGsֿ1-4ooTZ?K Gc+oyڙoNuh^iSo5{\ܹ3Yos}$.nQ-~n,-zr~-|K4R"8a{]^;I<ȤL5"EԤP7_j>OoK;*U.at*K[fym3ii^#wcC'IIkIp$󿉵|CtĈpW¹l{9>⪦׺*ͯj.LfGߍԁw] |WW18>w.ӯ! VӃ :#1~ +މ=;5c__b@W@ +^]ևՃ7 n&g2I8Lw7uҭ$"&"b eZ":8)D'%{}5{; w]iu;_dLʳ4R-,2H6>½HLKܹR ~foZKZ࿷1[oZ7׫Z7R¢?«'y?A}C_iG5s_~^ J5?œ tp]X/c'r%eܺA|4ծ-Ե+ْe1M38Ǯ `|Kյ OVڅu;"d56, X5kYR<̭CiطXԮ];Oy)OcWj֩}=܅s۸QZ*<~%뺃ȶp f~Bðzb\ݳzW*y{=[ C/Ak oXCkt_s}{'y?AmCjޓ{ WRV7r. g~Q"7&͹+c<=,dJ1V߁=T)TR՜*N4 ^Bڥ%B+=@fE5ka}ędܤFH^i1k\Sgdk> ֤aOM\_\T)8靠㡮3ģR: jj,pk/K!t,=ϯZ6(((((((49 xn_kLk&f9sK`zx{{y8H 8b4>ÇНE|7v(z/]k7IxM}8!ycZRQ pKVr(RPEr?^}'ðh{x+ՀLW154cK@Ng C)rr9+c:׹b Жf*s^ fKS7^} *{zq_@8# pF~ [VPe(nw0MW=3#kȵz晨cy PpG#W:%drMh]3HH<\]ԁ|_W HHҡb}P>k {ZErxMX@8C&qskLۙOnO^sCk7ql2XCw5VG.S~H8=(s1~cV5z %v|U2QF=NoW]ո?<`~׮}=ӬfԵ,=;"~Iy7K#g{ñJ?5$y` zz@-~m7mG宝Gٱ>G&K#]؃y1$$t>wqjstX.b̐{Wej)Dxfc:8)=$y|L`xV8ߙ~E)HkwW$J0uʟk>6Sgp~;4֌W+חc"=|ř9bc5> *rg {~cj1rnI#G|8v4wĿhFb><^ pJLm[Dl1;Vx5IZ:1*p)إ1ZbAK(1ׅ|S&5{^ KG^5r>;X׻K^? s fk^8O/"J)3K]N)iL?5!ƾq:G_=X- i,vi2N3 |03Qas ! 7}kZU781M,->e;@Qz T(GK(ah(((((((Y[×j2F}o־oYYq $+]%$ v^rϭ`nax,ZEuWSܽ,g%~"MrsrY~Ҿ"Fت;8{ѰxYEfP^;WPwqbB:c?zp<7;SBfZ)dϛ; 7s^>}⍱x?Bix^#hf,*P9S{w[]GF?1Z_nG~]kk)9Sc5Ո<<6J-ϛ}xUi>ux#ţc'{ᛲq?Oo?x&mѱ'#^t)ϲbb0 F«kIVmVsv@}kҡ!ˍUTtxO̧]ORb|2yԵk܊{sPIc_?ħ:Ig)=Z~' "\M2VSSMyLsl⺿U~"C7\hz_ Rs$~? TAi<lO*>U}+'f>7_K N s8g1^CeКÿE ;{+Y\ O5|Y{/o+ LVcO;7Zx-Ek&dpzbӱ+TaB0gNy׭ 3^c T\$⫫?F33?t._Q~Nln:U/Ceb1-im WʸQM+VpafR3d׫é|Aү-q*I P7:y&]hX^Fbtpܩ?|Wu󭏤ʫxJ3ߴm"(uqA}j.+?S wV ~ [B&<^U?rϜ_OH\'.;|.%pw/ZZG'1j(#0UT` Wzw}>_*9m>󑓀F?EL3"zpubzΕ$+0܉&3zڶ+jyr1QE ( ( ( ( ( ( ( (UIdC0EZm+]Y6^![ ԯsmܶ捆?+me+ZE29)B[;я*wGxsK7;5w)}gH~.Ɣx?X\ߚ}A@tQ(:ͧ|Iq(CT?v[sKG+*רqҍck <#Ljα5݈`8cXP6T5i.K!xX*p&ќZǓϘ7 *oƽ:wlຈ:Q5yIEA/2*2jAҐe}k%K$N9R2?7ýKMV!{W9\PA+c4w` Wx=Ze\X{}yXI Ү!aOÎ{]Qx)#D@9E:*NJ}b|Z>_k7:d$z >&Vv󃏽WlR:RqJfGإd9Tm(ҝEtO}1O[xxEYt8,3v bFF )ǙrPNE8=O#V*Cc𹾾&l&cmCh<.P{ʦ&ۣY+Gxs~k5$> ӥPquŽўZt~Tl>Q.g> %k#ú:Kn'&{[yWQGqF}AЅ׮/}<;VYZa$wQg!$;_ $NKS}“_{MY|w7G!"\JtRy+贾d|o/;5jz_6fHwk<ѰJ#]kAȎ J =YNu%dxRwwbEQEQEQEQEQEQEQEQEQE'fLQZ(1F)hQ@X1KEQE-Q@ 1KE3h=iPb(((1GjZ(-ʹRPbR@ 1KE7`bڒyS0(-&)P+ ڎԴP11F)h&:LRmQ@Q@Š(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((,RmuM. I-nBvskƭON%I4/# WW@|i9Q3|뜨9>h1G`QZX ,m39V8$s@QEQEW|@ֶ>GDu39((:c:u}oc?hn#u˫nPpr=E{Q@Q@Q@Q@Q@Q@W#['/.ln~As3G7!F獹9p@; +g|xGo[89= :4e/u^'a!8FF8U$$(cPAEyŸ\εoVoo*13r'Og?o ֆ vb S{+Ҿ:n6evo gٌ0G^];6oYԷd"~quz=;3Oj<Pğg2Cg+XH/(so?mO-w n6w+02kbo 6q|=(n-mc_Gig c'uߌxWWTS-Աʥ"{ߞB?C@ k[nhQGQNt b|dam߲Fۜg uC²訫7_|oqsA*Y$ȡ8 q۱Wğǭ61q:b$ Drxm9| /O76wQwwoqRۏF_??zu__/1s bd?)f#Г/_Qx^hX%)TEp#7q^gcǒYX.wʋʤDό| 5䘗 aI$|GԼ?{6 3I9`84x<;k{)-R_1+`y*C6x7xİ?w\%)3Qnax=+όo4Ѭtݞ>{ө?xjxNAKtEde`pz28#x4Ol׾6&vK8,7dDu 1<OAc~״/]Vf4f2&Fu'nNU\4]OKASasp#y ͽ80㏼Tdoǝ ڌZnc>}q(n3+1UUı@{PqOY+ZyVicPON2B88y^OoxO i!kH,ќ6J6 ܟA-Y.;YDА=Z؃Zko?  HDUE.0b1CZ3yʫ% 0IPHmg'kuM #r0N# )_.އ*;[ Í0LuQڽ#nsƓg"ޯtÕ$<([VVӣ{Pʬe`29X¬jr|vNYcd P>xijD5[A|wG^;ej|B={'|5_vDW,!uEdʄ v@_:$CP~#_jw"GO; 9?GI{ jvR8((vq03@&h"*o4z׈IGdLv p}:I x!_H~9Й=ǚZ;u=7KݵuCwv:τ|g}MA!gLBFG^yZK6x]R鮢RSsdu?S]_$O*ZWCԟ%Hf{VS |W<1_xlk2k>rirX)p @`zj?<R׏_+Ѡ N,8ed*K}}O_x7ApAy42I]CJ Ft)+ ( ( ( ( ( ( ( ( ( ( (<yV?-t m| {lG%J%[ +'oikkQ2 ιR_?^ۏ9@2x;ösuH5K BN2((@< "ď2\OB nU 6I>|9vIQ2M4~t*ne<zQ@IWZ^m$vO:\ʼ^%HLu#>|Lnߧa2n.XB u ռG4I#C+ qOGAyv6O/vs/v͹m|s ιmqaB-&=y>S#22 )$~xG^ 6>g١yQ@:|մk>*|EZiMS*.E'i fB `(vqc [fB `(vq& i:]ƝaAż:ispC²訫5},HuG2)wc׽o7t,4;?Z)y2N\GU_w[ vc:Eٱ˯)y11c~"ΊW5F7/<0A5Ooŭ/Ma|=_=6H0b*=˖ǯ? </=$$YlrǓ]~ӒHpvB@s,rN94}uZIgd̫ȈTR3W]xM&"8e*͐APH Q<[oqsA*92<G/~wmdg8l۟qq@?N4+?2i#'28# HI X:IM[85w꛱ԀXO:gcg@ml|ϳC<  c*9 YS Y1#`2(B;|Q$o V$rC=zW|dE4CJ;d1-򐾿?7<]w3"NxUp{]xYt]7J[q #egzA@-֟o$X#icl  n ~.hZuf =f/.fs̪@WA\,׬W/^U4H'fFxd 7g@_[']k0lV=:=EtNX"{ok S\CD29Gbq^A6[0D#5 `(J xե0PrlszK/ /)7S"'' O8 }u\|@R}kas&2b kc&t[k:oys:nrWюAb!($ qUE81RP$'^Lva;E[%80Sc 1SuƞK=n|9CF 1rq[?ÿ \}gHҾ|47ܕlۜ|):c{#DaL<+r$`W51o:,kiϨyD*=ﱶu#st-нrz/-KBa+HawW#'$}hcq|(ᵏ̑bI9G<*7s^a^mݳ̒ur&Vqdma:W}:SxrB(s׭hxSc+ .dҮMDlFW8gCC=ad3F=UN`h?ס*^ŠItiK)\|($l$G'a’yBN4O 4m. "9 Q\XhM}JXA=@<$gR3qǩDŽ;c\K+s^9cܐA ^+k s=;?InQ_P_|C)o?+;.Ul89ž+|uP`GTXHq @'b3I^7NƿiG|SK<~-9u'9 M77O[i.!7RPaH .:H5<o= OO+LD k Woop8*?i\uxSeRq+f8-$Gߌ^k2hdu$}rA6(6e%5|So4zޣ`]ı$SuA bxߊ^OeeinYNUm FgZ>&|Exp.I6073 GV۸תxs_O56HY\^i:䖷Q<3'܌a.FA=+?hNIXehh]Æ9ȍ?/s@EPYމxGIխc>2-웶aʐG  hQ@_kBO>"Ҭl-4mR(#EEP|HM6A^:_A~:iv:$u7{Wa\l!`A 2d> zGlлD}@u$15}w?±k+h'cRxI熿kƗex9.gNcr 6xk⟊ V u-졊;̻fU@BFz5Mj"xwVL#iOޗN n lP ? jSk>5KgE2IO4_[ƷKBtf79?q g㰂mmⷷ8`GjQ@W5m~=j໻K TY4MJ !(>6sg6i[~y#uo=QIࡕ] @WY/>6ҤӮj,} r \U pMsn~!>5|Cþ!vf" n`yCiEK^O'UZ;IaXTi:7;Rci9k %K%`8/V>/<5Ϯ1± ;.eq@ǼůD5/x]2=qd亀,IF2X8FEp #oںmw1r~6rKujwn~![I9kS=}r/xG / j]ISrG@hNS;_i~<#Z;e>pp؂ ;\MJKM%dnm丆@ *"NUda<D>Ku9aI6vl1(so$D#<\؀GzkZ_OG=1Ic Q|^oQIQ $4G Hu`7>x!S|Odzo\idSyxrA<}3Ekx$'Fh,#q3y=p:=N; .dɠHA#/K?x< 30dr]G[7n{%5` :qaPPQk"ē $r$yUc9W 4`| i_I[{ PȡԌA8xYž-Դ q;[;Cr~\{j|{lw:tKV2v:A9_Z%$B(cujKkz/4m^?4վD-J%=|1w,t}g/vN1{P,ZT`AׄfIsƏR|N@.yxW#?kOE6+̕dqs+M;zwFY9 B3^+QƗz[ģ [=rJ`HײWօ=E6}[2i&T)S9H*Qzx|Uuo-Mfh%BG"JF ς V=m/Kh%kkV`Up6aoZԺt{F :Uom5$n;WjkB[sKؘH^tdBi#̐D@$ {QTk9K9-;e 8 :6!J# ?JSvwk&7<2Hʙp@??|IYga;U;!#E$D$ƀ=ͧh6Wr^OooR\ɝ2I9$g⟇$׼Gw|CtYlI,"%QhY' _~Ҵ+~k:K{y0ںI&㹷0'$sנxDž>>_ۻ8#æ>@Y㩗F#V!w(3O ռW4x䍃+s_KaHrhc@cz^oJ-f-)Ӑ2 1,l$,|SBxzm6H洲KrV}Á+AېpkXƗw<1߲;:H!P8 >yV?-{q O<|78G]ܿsڀ4< $_ K^_>]5sBv;) G&F [{bx{L|;6[yv؁wc'qV/m=:?2'dF`C FA=(~+~P'tucs/1@9OZo?]ڋ}+7P[U9 ~^|o{WAi؞4; Vnݻ ]qd[F5j\<)eɕ0ǝb)A\WW㟄y:Ie2dz6 PxιM۬0rU=JPi(L$%WJ]c@[zo{"/6Х7(eA.x%sO? j1k6ד[J_[ *AVu%  qB;MWUOS7+Q'$kρڟOjOK+v#m3WomQrڼyeJ 5<V|$v1yU1Pqt@ngDWx ʬHRGP V}+#\:- vB| F?|*}jG{$.o 8!8=Mx rO63.L99zP)KM ;=m>tjn S*G #8]#hKcEͨۻڻ"po *%X^hGBe}\NCK1`rzL,^]9lO7` ?$ @G$Ə3Y.Ka}Ncڼ~zGi`Ep#RADٹH*< y`h$BcP>;WQ@m5CVgյ{ܫʥ0a͹Kz cPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPOz_"m^i˧yqs7PB'wc?<k3=$]c׹J*9[cHU I9|ǎtYxOIVH{{n%\0Zoel#>xmm常8` $Q@$ԕZԦҾŹ eusҀ<~2~"j1FZ*9^)Dݴnyhլtk+{,縷(cYst+i+/q5ġ`,/6ƧOzexGÚ7unRյHˉk!4f\jEE^'%UjIaY?TT)AgOz濪l-~EW*}^E|hw?jX4&0nϷucO$M}_?((?׼_x\Y祿h,h1olc#5}Zx_JH0[,.0A;ztO}/:ھ?o $ ='.Qe yo䉕X(qw ռG4I#C+ qƏx=Uw+.wN덁NOH }@r{?c(nm]/*$v<`sԢ(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((PK(FpApPK"8AOEBPS/dcommon/contbig.gif`GIF87a!!!111999BBBJJJRRRccckkksss{{{skk{{ZRRRJJƽ{sZRJRJB91)kcZB9)sskZRJ1޽ƽ{{ssskkkcƵZZRccZRRJJJB{BB9991ssckkZccR))!RRB!!JJ1))99!11ƌ)1R)k֔)s1RZJR{BJs9R1J!11J1J9k{csZk!1J!)cBR9J1B)91B!cRs{!)s!){1B!k!s!{ksksckckZc9B)1!)!)BJ9B1919έƌ!!)JJcZZ{!!!1RR{JJsBBkJJ{!!9BB{1!!J9)!!Z!!c1!!kR!!s9Z!BckJs)19!!c!!ZRZ,H rrxB(Kh" DժuICiи@S z$G3TTʖ&7!f b`D 0!A  k,>SO[!\ *_t  Exr%*_}!#U #4 & ֩3|b]L ]t b+Da&R_2lEٱZ`aC)/яmvUkS r(-iPE Vv_{z GLt\2s!F A#葡JY r|AA,hB}q|B`du }00(䡆<pb,G+oB C0p/x$…– ]7 @2HFc ) @AD \0 LHG',(A` `@SC)_" PH`}Y+_|1.K8pAKMA @?3҄$[JPA)+NH I ,@8G0/@R T,`pF8Ѓ)$^$ DDTDlA@ s;PKPK"8AOEBPS/dcommon/darbbook.cssPKPK"8A!OEBPS/dcommon/O_signature_clr.JPG"(JFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?O '~MQ$Vz;OlJi8L%\]UFjޙ%ԯS;rA]5ފ<׈]j7Ouyq$z'TQuw7Ŀ KX߁M2=S'TQt?.5w'97;~pq=" ~k?`'9q6 E|yayM^Om'fkC&<5x' ?A?Zx'jß={=SßM gVC.5+Hd֪xc^)Җufz{Cީ|D Vkznq|+Xa+{50rx{|OG.OϞ~f/ xxX[2H )c+#jpUOZYX\=SG ߨC|K@;_߆'e?LT?]:?>w ڔ`D^So~xo[Ӡ3i7B:Q8 Vc-ďoi:FM292~y_*_闱YN\Fr=xZ3鳎OwW_QEzW~c]REeaSM}}Hӏ4&.E]u=gMѠ+mF`rNn$w9gMa꺢nTuhf2Xv>އ a(Û6߭?<=>z'TQuw7Ŀ KX߁M2=S'TQt?.5Kko\.8S$TOX߀Gw?Zx汴X)C7~.i6(Щ=+4{mGӭ¸-]&'t_kV*I<1)4thtIsqpQJ+> \m^[aJ5)ny:4o&QEnyAEPEEss 72,PDۢ׃K W{Wjr+wگ iM/;pd?~&?@;7E4gv8 $l'z'TQuw7Ŀ Gֱ=ɿ&G?. iR(5W*$|?w᫼gkmIbHe/_t>tg%y.l}N5[]+Mk0ĠeHdPrsst'UiC,y8`V%9ZIia|ܪvi מYG,o}+kk{YbyIeb*sAtի82zWoEK5z*o-eo;n(P u-I)4Š(HQEQEQEQEhz(X/Đ?}Bk˩ ݏrk0]4>8XzV? }6$}d^F>nU K ?Bտk_9׾x~w'ߞ  uDŽtL ؈5c-E/"|_Oo.IH쐍=i*Iw5(ںw?t5s.)+tQ2dUt5Vĺ.jZ"@IRrZƅY4ߡ_;}ų(KyQf1Aǵt?sZg+?F5_oQR&Dg߿]6FuRD u>ڿxl7?IT8'shj^=.=J1rj1Wl$얲cPx;E,p$֟ˏkw qg"45(ǛkV/=+ũ)bYl~K#˝J_כ5&\F'I#8/|wʾ_Xj Q:os^T1.M_|TO.;?_  jF?g N 8nA2F%i =qW,G=5OU u8]Rq?wr'˻S+۾.ܼ 87Q^elo/T*?L|ۚ<%<,/v_OKs B5f/29n0=zqQq(ª=VX@*J(э(f5qJN_EVǞQEOuoѕOuoa5}gO?:߂8Wא|cڽ~]N&O( (<]>͠@VQ=^~U ̴m&\խ5i:}|}r~9՝f}_>'vVֲ$~^f30^in{\_.O F8to}?${φ|#x^#^n~w=~k~?'KRtO.㌡h![3Zu*ٷճ(ԟ]z_/W1(ԟ]v~g|Yq<ז0 ; b8֮s,w9\?uEyStKaª@\,)) (!EPEPEPEPEPzѧts{v>C/"N6`d*J2gGӧWqBq_1ZuΓ\X]r?=Ey88Mp&pKtO-"wR2 K^-Z< \c>V0^@O7x2WFjs<׻kZ(<Т(OFw/6$1[:ޯԯ#q~4|,LVPem=@=YLUxӃV}AUbcUB.Ds5*kٸAeG>PJxt͝ b88?*$~@ׯD VkraiJs}Q.20x&mXξ,Z]“A-J#`+-E/"<]\a'tZGy.(|lދ~gMK OZdxDŽU9T6ϯ^<Ϡt5CZ]].t۫S=s`ڳ%8iVK:nqe+#<.T6U>zWoy3^I {F?J~=G}k)K$$;$de8*G Uӟ4Ocºw}|]4=ݣ\x$ʠms?q^ipw\"ȿPs^Z Q_0GڼU.t}ROM[G#]8wٞ ӫ87}Cgw vHȩBM55vof =A_٭`Ygx[6 P,5}>蚊(0(+?>+?> k|TuXq6_ +szk :u_ Z߶Ak_U}Jc2u/1[_»ݸG41-bሬ۴}}Eȹפ_c?5gi @cL\L<68hF_Ih>X4K7UТ sMj =J7CKo>Օ5s:߀t ~ηaٿ?|gdL8+gG%o?x`دOqȱwc¨&TW_V_aI=dpG!wu۞սZ1yL50$(l3(:~'ַo A}a3N*[0ǭ HKQV}G@֜$ 9of$ArNqUOgË05#m?D)^_h//5_/<?4}Jį+GkpG4"$ r| >S4Ђ"S 1%R:ȝ 8;PKPz PK"8AOEBPS/dcommon/feedback.gif7GIF89a'%(hp|fdx?AN5:dfeDGHɾTdQc`g*6DC\?ؘ||{;=E6JUՄfeA= >@,4`H.|`a (Q 9:&[|ځ,4p Y&BDb,!2@, $wPA'ܠǃ@CO~/d.`I @8ArHx9H75j L 3B/` P#qD*s 3A:3,H70P,R@ p!(F oԥ D;"0 ,6QBRɄHhI@@VDLCk8@NBBL2&pClA?DAk%$`I2 #Q+l7 "=&dL&PRSLIP)PɼirqМ'N8[_}w;PK-PK"8AOEBPS/dcommon/booklist.gifGIF89a1޵֥΄kZ{Jk1Rs!BZ)B),@I9Z͓Ca % Dz8Ȁ0FZЌ0P !x8!eL8aWȠFD(~@p+rMS|ӛR$ v "Z:]ZJJEc{*=AP  BiA ']j4$*   & 9q sMiO?jQ = , YFg4.778c&$c%9;PKː5PK"8AOEBPS/dcommon/cpyr.htm1 Oracle Legal Notices

Oracle Legal Notices

Copyright Notice

Copyright © 1994-2012, Oracle and/or its affiliates. All rights reserved.

Trademark Notice

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.

Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks are used under license and are trademarks or registered trademarks of SPARC International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or registered trademarks of Advanced Micro Devices. UNIX is a registered trademark of The Open Group.

License Restrictions Warranty/Consequential Damages Disclaimer

This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.

Warranty Disclaimer

The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please report them to us in writing.

Restricted Rights Notice

If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, the following notice is applicable:

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007). Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

Hazardous Applications Notice

This software or hardware is developed for general use in a variety of information management applications. It is not developed or intended for use in any inherently dangerous applications, including applications that may create a risk of personal injury. If you use this software or hardware in dangerous applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of this software or hardware in dangerous applications.

Third-Party Content, Products, and Services Disclaimer

This software or hardware and documentation may provide access to or information on content, products, and services from third parties. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party content, products, and services. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of third-party content, products, or services.

Alpha and Beta Draft Documentation Notice

If this document is in prerelease status:

This documentation is in prerelease status and is intended for demonstration and preliminary use only. It may not be specific to the hardware on which you are using the software. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to this documentation and will not be responsible for any loss, costs, or damages incurred due to the use of this documentation.

Oracle Logo

PKN61PK"8AOEBPS/dcommon/masterix.gif.GIF89a1ޜΌscJk1Rs!Bc1J),@IS@0"1 Ѿb$b08PbL,acr B@(fDn Jx11+\%1 p { display: none; } /* Class Selectors */ .ProductTitle { font-family: sans-serif; } .BookTitle { font-family: sans-serif; } .VersionNumber { font-family: sans-serif; } .PrintDate { font-family: sans-serif; font-size: small; } .PartNumber { font-family: sans-serif; font-size: small; } PKeӺ1,PK"8AOEBPS/dcommon/larrow.gif#GIF87a絵ƌֵƽ{{ss֜ƔZZ{{{{ZZssZZccJJJJRRBBJJJJ991111))!!{,@pH,Ȥrl:ШtpHc`  өb[.64ꑈ53=Z]'yuLG*)g^!8C?-6(29K"Ĩ0Яl;U+K9^u2,@@ (\Ȱ Ë $P`lj 8x I$4H *(@͉0dа8tA  DсSP v"TUH PhP"Y1bxDǕ̧_=$I /& .)+ 60D)bB~=0#'& *D+l1MG CL1&+D`.1qVG ( "D2QL,p.;u. |r$p+5qBNl<TzB"\9e0u )@D,¹ 2@C~KU 'L6a9 /;<`P!D#Tal6XTYhn[p]݅ 7}B a&AƮe{EɲƮiEp#G}D#xTIzGFǂEc^q}) Y# (tۮNeGL*@/%UB:&k0{ &SdDnBQ^("@q #` @1B4i@ aNȅ@[\B >e007V[N(vpyFe Gb/&|aHZj@""~ӎ)t ? $ EQ.սJ$C,l]A `8A o B C?8cyA @Nz|`:`~7-G|yQ AqA6OzPbZ`>~#8=./edGA2nrBYR@ W h'j4p'!k 00 MT RNF6̙ m` (7%ꑀ;PKl-OJPK"8AOEBPS/dcommon/index.gifGIF89a1޵ΥΥ{sc{BZs,@IM" AD B0 3.R~[D"0, ]ШpRNC  /& H&[%7TM/`vS+-+ q D go@" 4o'Uxcxcc&k/ qp zUm(UHDDJBGMԃ;PK(PK"8AOEBPS/dcommon/bookbig.gif +GIF89a$!!!)))111999BBBJJJRRRZZZccckkksss{{{skkB991)))!!B11))1!JB9B9!!cZ9ƭƽssk{ZZRccZRRJJJBBB9c!!ν)1)k{s絽ƌkssֽZccJRRBJJ{9BB)11)99!!))11!!k!JZ!)RcJccBcs)1c)JZ!BR!)BZ)99J!Rk9!c11B)Z{)9Bkc1kB9BZ!Z{9Rs)Jkksk9kB1s1Jk9Rƥc{k9s)Z{1k91)s1Rk)Jc1J!))BZ!1k{csc{)19B!)Bcsc{ksc{kZs!RkJkJkքc{9Zks{ck9R)Bks9R9R1J!)Z1B!)c)9)99BR19kksBBJcc{ccBBZ))9kk!!199c11ZBB{9!!R!!Z!!c))!!kR!!s!!BcksRZ1c9B)R91c1)Z!R9B9k1)RcZ{)!1B9JB9B)!)J9B!& Imported from GIF image: bookbig.gif,$!!!)))111999BBBJJJRRRZZZccckkksss{{{skkB991)))!!B11))1!JB9B9!!cZ9ƭƽssk{ZZRccZRRJJJBBB9c!!ν)1)k{s絽ƌkssֽZccJRRBJJ{9BB)11)99!!))11!!k!JZ!)RcJccBcs)1c)JZ!BR!)BZ)99J!Rk9!c11B)Z{)9Bkc1kB9BZ!Z{9Rs)Jkksk9kB1s1Jk9Rƥc{k9s)Z{1k91)s1Rk)Jc1J!))BZ!1k{csc{)19B!)Bcsc{ksc{kZs!RkJkJkքc{9Zks{ck9R)Bks9R9R1J!)Z1B!)c)9)99BR19kksBBJcc{ccBBZ))9kk!!199c11ZBB{9!!R!!Z!!c))!!kR!!s!!BcksRZ1c9B)R91c1)Z!R9B9k1)RcZ{)!1B9JB9B)!)J9BH`\Ȑ:pظа"A6DBH,V@Dڹ'G"v Æ ܥ;n;!;>xAܽ[G.\rQC wr}BŊQ A9ᾑ#5Y0VȒj0l-GqF>ZpM rb ;=.ސW-WѻWo ha!}~ْ ; t 53 :\ 4PcD,0 4*_l0K3-`l.j!c Aa|2L4/1C`@@md;(H*80L0L(h*҇҆o#N84pC (xO@ A)J6rVlF r  fry†$r_pl5xhA+@A=F rGU a 1х4s&H Bdzt x#H%Rr (Ѐ7P`#Rщ'x" #0`@~i `HA'Tk?3!$`-A@1l"P LhʖRG&8A`0DcBH sq@AXB4@&yQhPAppxCQ(rBW00@DP1E?@lP1%T` 0 WB~nQ@;PKGC PK"8AOEBPS/dcommon/rarrow.gif/GIF87a絵ƌֵƽ{{ss֜ƔZZ{{{{ZZssZZccJJJJRRBBJJJJ991111))!!{,@pH,Ȥrl:ШLlԸ NCqWEd)#34vwwpN|0yhX!'+-[F 'n5 H $/14w3% C .90" qF 7&E "D mnB|,c96) I @0BW{ᢦdN p!5"D`0 T 0-]ʜ$;PKJV^PK"8AOEBPS/dcommon/mix.gifkGIF89aZZZBBBJJJkkk999sss!!!111cccֽ{{{RRR)))猌ƭ{s{sks!,@@pH,B$ 8 t:<8 *'ntPP DQ@rIBJLNPTVEMOQUWfj^!  hhG H  kCúk_a Ǥ^ h`B BeH mm  #F` I lpǎ,p B J\Y!T\(dǏ!Gdˆ R53ټ R;iʲ)G=@-xn.4Y BuU(*BL0PX v`[D! | >!/;xP` (Jj"M6 ;PK枰pkPK"8AOEBPS/dcommon/doccd_epub.jsM /* Copyright 2006, 2012, Oracle and/or its affiliates. All rights reserved. Author: Robert Crews Version: 2012.3.17 */ function addLoadEvent(func) { var oldOnload = window.onload; if (typeof(window.onload) != "function") window.onload = func; else window.onload = function() { oldOnload(); func(); } } function compactLists() { var lists = []; var ul = document.getElementsByTagName("ul"); for (var i = 0; i < ul.length; i++) lists.push(ul[i]); var ol = document.getElementsByTagName("ol"); for (var i = 0; i < ol.length; i++) lists.push(ol[i]); for (var i = 0; i < lists.length; i++) { var collapsible = true, c = []; var li = lists[i].getElementsByTagName("li"); for (var j = 0; j < li.length; j++) { var p = li[j].getElementsByTagName("p"); if (p.length > 1) collapsible = false; for (var k = 0; k < p.length; k++) { if ( getTextContent(p[k]).split(" ").length > 12 ) collapsible = false; c.push(p[k]); } } if (collapsible) { for (var j = 0; j < c.length; j++) { c[j].style.margin = "0"; } } } function getTextContent(e) { if (e.textContent) return e.textContent; if (e.innerText) return e.innerText; } } addLoadEvent(compactLists); function processIndex() { try { if (!/\/index.htm(?:|#.*)$/.test(window.location.href)) return false; } catch(e) {} var shortcut = []; lastPrefix = ""; var dd = document.getElementsByTagName("dd"); for (var i = 0; i < dd.length; i++) { if (dd[i].className != 'l1ix') continue; var prefix = getTextContent(dd[i]).substring(0, 2).toUpperCase(); if (!prefix.match(/^([A-Z0-9]{2})/)) continue; if (prefix == lastPrefix) continue; dd[i].id = prefix; var s = document.createElement("a"); s.href = "#" + prefix; s.appendChild(document.createTextNode(prefix)); shortcut.push(s); lastPrefix = prefix; } var h2 = document.getElementsByTagName("h2"); for (var i = 0; i < h2.length; i++) { var nav = document.createElement("div"); nav.style.position = "relative"; nav.style.top = "-1.5ex"; nav.style.left = "1.5em"; nav.style.width = "90%"; while (shortcut[0] && shortcut[0].toString().charAt(shortcut[0].toString().length - 2) == getTextContent(h2[i])) { nav.appendChild(shortcut.shift()); nav.appendChild(document.createTextNode("\u00A0 ")); } h2[i].parentNode.insertBefore(nav, h2[i].nextSibling); } function getTextContent(e) { if (e.textContent) return e.textContent; if (e.innerText) return e.innerText; } } addLoadEvent(processIndex); PKo"nR M PK"8AOEBPS/dcommon/toc.gifGIF89a1ΥΥ{c{Z{JkJk1Rk,@IK% 0| eJB,K-1i']Bt9dz0&pZ1o'q(؟dQ=3S SZC8db f&3v2@VPsuk2Gsiw`"IzE%< C !.hC IQ 3o?39T ҍ;PKv I PK"8AOEBPS/dcommon/topnav.gifGIF89a1ֽ筽ޭƔkZZk{Bc{,@ ) l)-'KR$&84 SI) XF P8te NRtHPp;Q%Q@'#rR4P fSQ o0MX[) v + `i9gda/&L9i*1$#"%+ ( E' n7Ȇ(,҅(L@(Q$\x 8=6 'נ9tJ&"[Epljt p#ѣHb :f F`A =l|;&9lDP2ncH R `qtp!dȐYH›+?$4mBA9 i@@ ]@ꃤFxAD*^Ŵ#,(ε  $H}F.xf,BD Z;PK1FAPK"8AOEBPS/dcommon/bp_layout.css# @charset "utf-8"; /* bp_layout.css Copyright 2007, Oracle and/or its affiliates. All rights reserved. */ body { margin: 0ex; padding: 0ex; } h1 { display: none; } #FOOTER { border-top: #0d4988 solid 10px; background-color: inherit; color: #e4edf3; clear: both; } #FOOTER p { font-size: 80%; margin-top: 0em; margin-left: 1em; } #FOOTER a { background-color: inherit; color: gray; } #LEFTCOLUMN { float: left; width: 50%; } #RIGHTCOLUMN { float: right; width: 50%; clear: right; /* IE hack */ } #LEFTCOLUMN div.portlet { margin-left: 2ex; margin-right: 1ex; } #RIGHTCOLUMN div.portlet { margin-left: 1ex; margin-right: 2ex; } div.portlet { margin: 2ex 1ex; padding-left: 0.5em; padding-right: 0.5em; border: 1px #bcc solid; background-color: #f6f6ff; color: black; } div.portlet h2 { margin-top: 0.5ex; margin-bottom: 0ex; font-size: 110%; } div.portlet p { margin-top: 0ex; } div.portlet ul { list-style-type: none; padding-left: 0em; margin-left: 0em; /* IE Hack */ } div.portlet li { text-align: right; } div.portlet li cite { font-style: normal; float: left; } div.portlet li a { margin: 0px 0.2ex; padding: 0px 0.2ex; font-size: 95%; } #NAME { margin: 0em; padding: 0em; position: relative; top: 0.6ex; left: 10px; width: 80%; } #PRODUCT { font-size: 180%; } #LIBRARY { color: #0b3d73; background: inherit; font-size: 180%; font-family: serif; } #RELEASE { position: absolute; top: 28px; font-size: 80%; font-weight: bold; } #TOOLS { list-style-type: none; position: absolute; top: 1ex; right: 2em; margin: 0em; padding: 0em; background: inherit; color: black; } #TOOLS a { background: inherit; color: black; } #NAV { float: left; width: 96%; margin: 3ex 0em 0ex 0em; padding: 2ex 0em 0ex 4%; /* Avoiding horizontal scroll bars. */ list-style-type: none; background: transparent url(../gifs/nav_bg.gif) repeat-x bottom; } #NAV li { float: left; margin: 0ex 0.1em 0ex 0em; padding: 0ex 0em 0ex 0em; } #NAV li a { display: block; margin: 0em; padding: 3px 0.7em; border-top: 1px solid gray; border-right: 1px solid gray; border-bottom: none; border-left: 1px solid gray; background-color: #a6b3c8; color: #333; } #SUBNAV { float: right; width: 96%; margin: 0ex 0em 0ex 0em; padding: 0.1ex 4% 0.2ex 0em; /* Avoiding horizontal scroll bars. */ list-style-type: none; background-color: #0d4988; color: #e4edf3; } #SUBNAV li { float: right; } #SUBNAV li a { display: block; margin: 0em; padding: 0ex 0.5em; background-color: inherit; color: #e4edf3; } #SIMPLESEARCH { position: absolute; top: 5ex; right: 1em; } #CONTENT { clear: both; } #NAV a:hover, #PORTAL_1 #OVERVIEW a, #PORTAL_2 #OVERVIEW a, #PORTAL_3 #OVERVIEW a, #PORTAL_4 #ADMINISTRATION a, #PORTAL_5 #DEVELOPMENT a, #PORTAL_6 #DEVELOPMENT a, #PORTAL_7 #DEVELOPMENT a, #PORTAL_11 #INSTALLATION a, #PORTAL_15 #ADMINISTRATION a, #PORTAL_16 #ADMINISTRATION a { background-color: #0d4988; color: #e4edf3; padding-bottom: 4px; border-color: gray; } #SUBNAV a:hover, #PORTAL_2 #SEARCH a, #PORTAL_3 #BOOKS a, #PORTAL_6 #WAREHOUSING a, #PORTAL_7 #UNSTRUCTURED a, #PORTAL_15 #INTEGRATION a, #PORTAL_16 #GRID a { position: relative; top: 2px; background-color: white; color: #0a4e89; } PK3( # PK"8AOEBPS/dcommon/bookicon.gif:GIF87a!!!)))111999BBBJJJRRRZZZccckkksss{{{ޭ{{ZRRcZZRJJJBB)!!skRB9{sν{skskcZRJ1)!֭ƽ{ZZRccZJJBBB999111)JJ9BB1ZZB!!ﭵBJJ9BB!!))Jk{)1!)BRZJ{BsR!RRJsJ!J{s!JsBkks{RsB{J{c1RBs1ZB{9BJ9JZ!1BJRRs!9R!!9Z9!1)J19JJRk19R1Z)!1B9R1RB!)J!J1R)J119!9J91!9BkksBBJ119BBR!))9!!!JB1JJ!)19BJRZckތ1)1J9B,H*\hp >"p`ƒFF "a"E|ժOC&xCRz OBtX>XE*O>tdqAJ +,WxP!CYpQ HQzDHP)T njJM2ꔀJ2T0d#+I:<жk 'ꤱF AB @@nh Wz' H|-7f\A#yNR5 /PM09u UjćT|q~Yq@&0YZAPa`EzI /$AD Al!AAal 2H@$ PVAB&c*ؠ p @% p-`@b`uBa l&`3Ap8槖X~ vX$Eh`.JhAepA\"Bl, :Hk;PKx[?:PK"8AOEBPS/dcommon/conticon.gif^GIF87a!!!)))111999BBBJJJRRRZZZccckkksss{{{ZRR޽{{ssskkkcccZ991ccRZZBBJJZck)19ZcsBJZ19J!k{k)Z1RZs1!B)!J91{k{)J!B!B911)k{cs!1s!9)s!9!B!k)k1c!)Z!R{9BJcckZZcBBJ99B119{{!!)BBRBBZ!))999R99Z!!999c1!9!)19B1)!B9R,  oua\h2SYPa aowwxYi 9SwyyxxyYSd $'^qYȵYvh ч,/?g{н.J5fe{ڶyY#%/}‚e,Z|pAܠ `KYx,ĉ&@iX9|`p ]lR1khٜ'E 6ÅB0J;t X b RP(*MÄ!2cLhPC <0Ⴁ  $4!B 6lHC%<1e H 4p" L`P!/,m*1F`#D0D^!AO@..(``_؅QWK>_*OY0J@pw'tVh;PKp*c^PK"8AOEBPS/dcommon/blafdoc.cssL@charset "utf-8"; /* Copyright 2002, 2011, Oracle and/or its affiliates. All rights reserved. Author: Robert Crews Version: 2011.10.7 */ body { font-family: Tahoma, sans-serif; /* line-height: 125%; */ color: black; background-color: white; font-size: small; } * html body { /* http://www.info.com.ph/~etan/w3pantheon/style/modifiedsbmh.html */ font-size: x-small; /* for IE5.x/win */ f\ont-size: small; /* for other IE versions */ } h1 { font-size: 165%; font-weight: bold; border-bottom: 1px solid #ddd; width: 100%; } h2 { font-size: 152%; font-weight: bold; } h3 { font-size: 139%; font-weight: bold; } h4 { font-size: 126%; font-weight: bold; } h5 { font-size: 113%; font-weight: bold; display: inline; } h6 { font-size: 100%; font-weight: bold; font-style: italic; display: inline; } a:link { color: #039; background: inherit; } a:visited { color: #72007C; background: inherit; } a:hover { text-decoration: underline; } a img, img[usemap] { border-style: none; } code, pre, samp, tt { font-family: monospace; font-size: 110%; } caption { text-align: center; font-weight: bold; width: auto; } dt { font-weight: bold; } table { font-size: small; /* for ICEBrowser */ } td { vertical-align: top; } th { font-weight: bold; text-align: left; vertical-align: bottom; } ol ol { list-style-type: lower-alpha; } ol ol ol { list-style-type: lower-roman; } td p:first-child, td pre:first-child { margin-top: 0px; margin-bottom: 0px; } table.table-border { border-collapse: collapse; border-top: 1px solid #ccc; border-left: 1px solid #ccc; } table.table-border th { padding: 0.5ex 0.25em; color: black; background-color: #f7f7ea; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; } table.table-border td { padding: 0.5ex 0.25em; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; } span.gui-object, span.gui-object-action { font-weight: bold; } span.gui-object-title { } p.horizontal-rule { width: 100%; border: solid #cc9; border-width: 0px 0px 1px 0px; margin-bottom: 4ex; } div.zz-skip-header { display: none; } td.zz-nav-header-cell { text-align: left; font-size: 95%; width: 99%; color: black; background: inherit; font-weight: normal; vertical-align: top; margin-top: 0ex; padding-top: 0ex; } a.zz-nav-header-link { font-size: 95%; } td.zz-nav-button-cell { white-space: nowrap; text-align: center; width: 1%; vertical-align: top; padding-left: 4px; padding-right: 4px; margin-top: 0ex; padding-top: 0ex; } a.zz-nav-button-link { font-size: 90%; } div.zz-nav-footer-menu { width: 100%; text-align: center; margin-top: 2ex; margin-bottom: 4ex; } p.zz-legal-notice, a.zz-legal-notice-link { font-size: 85%; /* display: none; */ /* Uncomment to hide legal notice */ } /*************************************/ /* Begin DARB Formats */ /*************************************/ .bold, .codeinlinebold, .syntaxinlinebold, .term, .glossterm, .seghead, .glossaryterm, .keyword, .msg, .msgexplankw, .msgactionkw, .notep1, .xreftitlebold { font-weight: bold; } .italic, .codeinlineitalic, .syntaxinlineitalic, .variable, .xreftitleitalic { font-style: italic; } .bolditalic, .codeinlineboldital, .syntaxinlineboldital, .titleinfigure, .titleinexample, .titleintable, .titleinequation, .xreftitleboldital { font-weight: bold; font-style: italic; } .itemizedlisttitle, .orderedlisttitle, .segmentedlisttitle, .variablelisttitle { font-weight: bold; } .bridgehead, .titleinrefsubsect3 { font-weight: bold; } .titleinrefsubsect { font-size: 126%; font-weight: bold; } .titleinrefsubsect2 { font-size: 113%; font-weight: bold; } .subhead1 { display: block; font-size: 139%; font-weight: bold; } .subhead2 { display: block; font-weight: bold; } .subhead3 { font-weight: bold; } .underline { text-decoration: underline; } .superscript { vertical-align: super; } .subscript { vertical-align: sub; } .listofeft { border: none; } .betadraft, .alphabetanotice, .revenuerecognitionnotice { color: #e00; background: inherit; } .betadraftsubtitle { text-align: center; font-weight: bold; color: #e00; background: inherit; } .comment { color: #080; background: inherit; font-weight: bold; } .copyrightlogo { text-align: center; font-size: 85%; } .tocsubheader { list-style-type: none; } table.icons td { padding-left: 6px; padding-right: 6px; } .l1ix dd, dd dl.l2ix, dd dl.l3ix { margin-top: 0ex; margin-bottom: 0ex; } div.infoboxnote, div.infoboxnotewarn, div.infoboxnotealso { margin-top: 4ex; margin-right: 10%; margin-left: 10%; margin-bottom: 4ex; padding: 0.25em; border-top: 1pt solid gray; border-bottom: 1pt solid gray; } p.notep1 { margin-top: 0px; margin-bottom: 0px; } .tahiti-highlight-example { background: #ff9; text-decoration: inherit; } .tahiti-highlight-search { background: #9cf; text-decoration: inherit; } .tahiti-sidebar-heading { font-size: 110%; margin-bottom: 0px; padding-bottom: 0px; } /*************************************/ /* End DARB Formats */ /*************************************/ @media all { /* * * { line-height: 120%; } */ dd { margin-bottom: 2ex; } dl:first-child { margin-top: 2ex; } } @media print { body { font-size: 11pt; padding: 0px !important; } a:link, a:visited { color: black; background: inherit; } code, pre, samp, tt { font-size: 10pt; } #nav, #search_this_book, #comment_form, #comment_announcement, #flipNav, .noprint { display: none !important; } body#left-nav-present { overflow: visible !important; } } PKʍPK"8AOEBPS/dcommon/rightnav.gif&GIF89a1ֽ筽ޭƔkZZk{Bc{,@ ) l)- $CҠҀ ! D1 #:aS( c4B0 AC8 ְ9!%MLj Z * ctypJBa H t>#Sb(clhUԂ̗4DztSԙ9ZQҀEPEPEPEPEPEPEPM=iԍP Gii c*yF 1׆@\&o!QY00_rlgV;)DGhCq7~..p&1c:u֫{fI>fJL$}BBP?JRWc<^j+χ5b[hֿ- 5_j?POkeQ^hֿ1L^ H ?Qi?z?+_xɔŪ\썽O]χ>)xxV/s)e6MI7*ߊޛv֗2J,;~E4yi3[nI`Ѱe9@zXF*W +]7QJ$$=&`a۾?]N T䏟'X)Ɣkf:j |>NBWzYx0t!* _KkoTZ?K Gc+UyڹgNuh^iSo5{\ܹ3Yos}.>if FqR5\/TӮ#]HS0DKu{($"2xִ{SBJ8=}Y=.|Tsц2UЫ%.InaegKo z ݎ3ֹxxwM&2S%';+I',kW&-"_¿_ Vq^ܫ6pfT2RV A^6RKetto^[{w\jPZ@ޢN4/XN#\42j\(z'j =~-I#:q[Eh|X:sp* bifp$TspZ-}NM*B-bb&*xUr#*$M|QWY ~p~- fTED6O.#$m+t$˙H"Gk=t9r娮Y? CzE[/*-{c*[w~o_?%ƔxZ:/5𨴟q}/]22p qD\H"K]ZMKR&\C3zĽ[PJm]AS)Ia^km M@dК)fT[ijW*hnu Ͳiw/bkExG£@f?Zu.s0(<`0ֹoxOaDx\zT-^ѧʧ_1+CP/p[w 9~U^[U<[tĽwPv[yzD1W='u$Oeak[^ |Gk2xv#2?¹TkSݕ| rݞ[Vi _Kz*{\c(Ck_܏|?u jVڔ6f t?3nmZ6f%QAjJf9Rq _j7Z-y.pG$Xb]0')[_k;$̭?&"0FOew7 z-cIX岛;$u=\an$ zmrILu uٞ% _1xcUW%dtÀx885Y^gn;}ӭ)場QEQ@Q@Q@Q@Q@Q@!4xPm3w*]b`F_931˜[ן+(> E ly;<;MF-qst+}DH @YKlLmؤciN<|]IU)Lw(8t9FS(=>og<\Z~u_+X1ylsj'eՃ*U3`C!N9Q_WܱhKc93^ua>H ƕGk=8~e#_?{ǀe-[2ٔ7;=&K挑5zsLdx(e8#{1wS+ΝVkXq9>&yஏh$zq^0~/j@:/«Vnce$$uoPp}MC{$-akH@ɫ1O !8R9s5ԦYmϧ'OUṡ5T,!Ԛ+s#1Veo=[)g>#< s)ƽُA^䠮ωFUj(ǩ|N3Jڷ睁ϱuږZYGOTsI<&drav?A^_f׻B$,O__ԿC`it{6>G׈C~&$y؎v1q9Sc1fH[ѽ>,gG'0'@Vw,BO [#>ﱺg5ΒFVD%Yr:O5 Tu+O멃]ی38Ze}R&ѝ_xzc1DXgس;<,_,{ƽY'AS#oF.M#~cBuEx7G+Y)(5q+GCV;qF+CLQ)qEC&6z𿊘z}?&w=+)??&\g{;V??׻xGœdٿ׼-Nc')3K]N)iLTӿCdb7Q^a N sd>Fz[0S^s'Zi 77D}kWus ab~~H(>.fif9,~|Jk;YN3H8Y(t6Q݉k͇_÷Z+2߄&[ +Tr^藺97~c܎=[f1RrBǓ^kEMhxYVm<[џ6| kqbѱ| YA{G8p?\UM7Z66 g1U1igU69 u5Pƪ:VVZC=[@ҹ¨$kSmɳО\vFz~i3^a Osŧυ9Q}_3 όO{/wgoet39 vO2ea;Ύ7$U#?k+Ek&dpzbӱ+TaB0gN{[N7Gי}U7&@?>Fz~E!a@s ?'67XxO*!?qi]֏TQN@tI+\^s8l0)2k!!iW8F$(yOּT.k,/#1:}8uT˾+5=O/`IW G֯b.-<= HOm;~so~hW5+kS8s.zwE| ?4ӿw/K N 9?j(#0UT` Wzw}:_*9m>󑓀F?ELzv=8q:=WgJ`nDr Zе<ֹ](Q@Q@Q@Q@Q@Q@Q@Q@ 'IdC0EYJVcMty_~u+Sw-aO n<[YJgL#6i g5ЖDZ14cʝ!!\/M}/_AYR__>oC? _?7_G#RERW쏞KB}JxGSkǕA pƱơP m]hwB7U$Zq M95"3q1ioATߚ{g.t uu2k=;h#YB= fgS :TdLԃ!44mFK{Hrd^7oz|BVr<{)6AXգV»|>*/hS܏z͆OM=Εq (s|s׊LKQI :9NJ)P+!ʣoAF>+=@I}"x/}۠1aנc¹4emC:>p_xWKX` >R3_S½èųp3޺u3N e یbmͺ<_ mnݮ1Op?Gm)Qb%N585'%Ahs\6yw!"&Ɨ._wk)}GP;Z!#\"< *oƾ\)}N>"լ/~]Lg}pBG X?<zZ#x69S=6) jzx=y9O&>+e!!? ?s~k5Gʏ)?*ce7Ox~k5􇔾Q/e7/Ԑ#3OgNC0] ;_FiRl>Q.g>!%k#ú:Kn'&}?U@\pџPtp)v<{_i}Oվֲ3XIYIx~b<D?(=_JXH=bbi=Oh?_ C_O)}oW쏜? %Ƶ;-RYFi`wۭ{ϖZMtQ$"c_+ԃx1*0b;ԕ݋ESQEQEQEQEQEQEQEQEQEQZ(1F)h1K@XLRE&9P (bf{RӨ&)PEPEPbԴPGKZ(iإbn(:A%S0(-&)P+ ڎԴP11F)h&:LRmQ@Q@Š(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((PKje88PK"8AOEBPS/dcommon/help.gif!GIF89a1εֵ֜֜{kZsBc{,@ )sƠTQ$8(4ʔ%ŌCK$A HP`$h8ŒSd+ɡ\ H@%' 6M HO3SJM /:Zi[7 \( R9r ERI%  N=aq   qƦs *q-n/Sqj D XZ;PKއ{&!PK"8A OEBPS/toc.htmU> Table of Contents

Contents

Title and Copyright Information

Preface

Part I XStream Concepts and Use Cases

1 Introduction to XStream

2 XStream Concepts

3 XStream Use Cases

Part II XStream Administration

4 Configuring XStream

5 Managing XStream

6 Monitoring XStream

7 Troubleshooting XStream

Part III XStream PL/SQL Packages Reference

8 DBMS_XSTREAM_ADM

9 DBMS_XSTREAM_AUTH

Part IV XStream OCI API Reference

10 Introduction to the OCI Interface for XStream

11 OCI XStream Functions

Part V XStream Data Dictionary Views

12 XStream Static Data Dictionary Views

13 XStream Dynamic Performance (V$) Views

Index

PKUUPK"8AOEBPS/xstrm_oci.htm OCI XStream Functions

11 OCI XStream Functions

This chapter describes the XStream functions for OCI.

A row logical change record (LCR) is used to encapsulate each row change. It includes the schema name, table name, DML operation, and the column values. For update operations, both before and after column values are included. The column data is in the format specified by the "Program Variable" column in Table 11-3. Character columns are converted to the client's character set.

A DDL LCR is used to encapsulate each DDL change. It includes the object name, the DDL text, and the DDL command, for example, ALTER TABLE or TRUNCATE TABLE. See Oracle Call Interface Programmer's Guide for a list of DDL command codes.


See Also:

Oracle Database Globalization Support Guide for more information about NLS settings.

XStream sample programs are found in xstream/oci under the $ORACLE_HOME/demo directory.


Each LCR also has a transaction ID and position. For transactions captured outside Oracle databases, any byte-comparable RAW array can be used as the LCR position, if the position of each LCR in the stream is strictly increasing.

This chapter contains the topic:

Introduction to XStream Functions

This section includes the conventions used to describe the functions.

Conventions for OCI Functions

For each function, the following information is listed:

Purpose

A brief description of the action performed by the function.

Syntax

The function declaration.

Parameters

A description of each of the function's parameters. This includes the parameter's mode. The mode of a parameter has three possible values, as described in Table 11-1.

Table 11-1 Mode of a Parameter

ModeDescription

IN

A parameter that passes data to the OCI.

OUT

A parameter that receives data from the OCI on this call.

IN/OUT

A parameter that passes data on the call and receives data on the return from this or a subsequent call.


Comments

More detailed information about the function (if available), which can include return values, restrictions on the use of the function, examples, or other information that can be useful when using the function in an application.


OCI XStream Functions

This section and Table 11-1 describe the OCI XStream functions.

Table 11-2 OCI XStream Functions  

FunctionPurpose

LCR Functions

To get and set one or more values of an LCR. Note: These calls do not require a server round-trip.

"OCILCRAttributesGet()"


Returns existing extra attributes from the LCR

"OCILCRAttributesSet()"


Sets extra attributes in a row or DDL LCR

"OCILCRFree()"


Frees the LCR

"OCILCRHeaderGet()"


Returns the common header fields for a row/DDL LCR

"OCILCRHeaderSet()"


Initializes the common header fields for a row or DDL LCR

"OCILCRDDLInfoGet()"


Retrieves specific fields in a DDL LCR

"OCILCRDDLInfoSet()"


Populates DDL-specific fields in a DDL LCR

"OCILCRLobInfoGet()"


Returns the LOB information for a piece-wise LOB LCR

"OCILCRLobInfoSet()"


Sets the LOB information for a piece-wise LOB LCR

"OCILCRNew()"


Constructs a new LCR object of the specified type (ROW or DDL) for the given duration

"OCILCRRowColumnInfoGet()"


Returns the column fields in a row LCR

"OCILCRRowColumnInfoSet()"


Populates column fields in a row LCR

"OCILCRRowStmtGet()"


Returns the generated SQL statement for the row LCR, with values in-lined

"OCILCRRowStmtWithBindVarGet()"


Returns the generated SQL statement, which uses bind variables for column values

"OCILCRSCNsFromPosition()"


Gets the SCN and commit SCN from a position value

"OCILCRSCNToPosition()"


Converts SCN to position

"OCILCRWhereClauseGet()"


Gets the WHERE clause statement for the given row LCR

"OCILCRWhereClauseWithBindVarGet()"


Gets the WHERE clause statement with bind variables for the given row LCR

XStream In Functions

To send an LCR stream to an XStream inbound server

"OCIXStreamInAttach()"


Attaches to an inbound server

"OCIXStreamInChunkSend()"


Sends chunk data to the inbound server

"OCIXStreamInCommit()"


Commits the given transaction

"OCIXStreamInDetach()"


Detaches from the inbound server

"OCIXStreamInErrorGet()"


Returns the first error encountered by the inbound server since the attach call

"OCIXStreamInFlush()"


Flushes the network while attaching to an XStream inbound server

"OCIXStreamInLCRCallbackSend()"


Sends the LCR stream to the attached inbound server using callbacks

"OCIXStreamInLCRSend()"


Sends the LCR stream to the attached inbound server using callbacks

"OCIXStreamInProcessedLWMGet()"


Gets the local processed low position

XStream Out Functions

To receive an LCR stream from an XStream outbound server

"OCIXStreamOutAttach()"


Attaches to an outbound server

"OCIXStreamOutChunkReceive()"


Retrieves data of each LOB or LONG or XMLType column one chunk at a time

"OCIXStreamOutDetach()"


Detaches from the outbound server

"OCIXStreamOutLCRCallbackReceive()"


Gets the LCR stream from the outbound server using callbacks

"OCIXStreamOutLCRReceive()"


Receives an LCR stream from an outbound server without using callbacks

"OCIXStreamOutProcessedLWMSet()"


Updates the local copy of the processed low-water mark



OCILCRAttributesGet()

Purpose

Gets extra attribute information in (ROW or DDL) LCR. In addition, it gets any extra non-first class attributes that are not populated through OCILCRHeaderGet(), OCILCRDDLInfoGet(), or OCILCRRowColumnInfoGet(), for example, edition name.

Syntax

sword OCILCRAttributesGet (      OCISvcCtx   *svchp, 
                                 OCIError    *errhp, 
                                 ub2         *num_attrs,
                                 oratext     **attr_names,
                                 ub2         *attr_namesl,
                                 ub2         *attr_dtyp,
                                 void        **attr_valuesp,
                                 OCIInd      *attr_indp,
                                 ub2         *attr_alensp,
                                 void        *lcrp,
                                 ub2         array_size,
                                 ub4         mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

num_attrs (OUT)

Number of extra attributes.

attr_names (OUT)

An array of extra attribute name pointers.

attr_namesl (OUT)

An array of extra attribute name lengths.

attr_dtyp (OUT)

An array of extra attribute data types. Valid data types: see Comments.

attr_valuesp (OUT)

An array of extra attribute data value pointers.

attr_indp (OUT)

An indicator array. Each returned element is an OCIInd value (OCI_IND_NULL or OCI_IND_NOTNULL).

attr_alensp (OUT)

An array of actual extra attribute data lengths. Each element in alensp is the length in bytes.

lcrp (IN)

Pointer to row or DDL LCR.

array_size (IN)

Size of the array argument in the other parameters. If array_size is not large enough to accommodate the number of attributes in the requested attribute list, then OCI_ERROR is returned. Parameter num_attrs returns the expected size.

mode (IN)

Specify OCI_DEFAULT.

Comments

The valid data types for attr_dtyp are:

SQLT_CHR
SQLT_INT
SQLT_RDD

OCILCRAttributesSet()

Purpose

Populates extra attribute information in row or DDL LCR. In addition, it populates any extra non-first class attributes that cannot be set through OCILCRHeaderSet(), OCILCRDDLInfoSet(), or OCILCRRowColumnInfoSet(), for example, edition name.

Syntax

sword OCILCRAttributesSet (      OCISvcCtx   *svchp,
                                 OCIError    *errhp,
                                 ub2         num_attrs,
                                 oratext     **attr_names,
                                 ub2         *attr_names_lens,
                                 ub2         *attr_dtyp,
                                 void        **attr_valuesp,
                                 OCIInd      *attr_indp,
                                 ub2         *attr_alensp,
                                 void        *lcrp,
                                 ub4         mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

num_attrs (IN)

Number of extra attributes.

attr_names (IN)

Pointer to an array of extra attribute names. Attribute names must be canonicalized.

attr_names_lens (IN)

Pointer to an array of extra attribute name lengths.

attr_dtyp (IN)

Pointer to an array of extra attribute data types. See valid data types in Comments of "OCILCRRowColumnInfoSet()".

attr_valuesp (IN)

Address of an array of extra attribute data values.

attr_indp (IN)

Pointer to an indicator array. For all data types, this is a pointer to an array of OCIInd values (OCI_IND_NULL or OCI_IND_NOTNULL).

attr_alensp (IN)

Pointer to an array of actual extra attribute data lengths. Each element in attr_lensp is the length in bytes.

lcrp (IN/OUT)

Pointer to a row or DDL LCR.

mode (IN)

Specify OCI_DEFAULT.

Comments

Valid attributes are:

#define OCI_LCR_ATTR_THREAD_NO              "THREAD#"
#define OCI_LCR_ATTR_ROW_ID                 "ROW_ID"
#define OCI_LCR_ATTR_SESSION_NO             "SESSION#"
#define OCI_LCR_ATTR_SERIAL_NO              "SERIAL#"
#define OCI_LCR_ATTR_USERNAME               "USERNAME"
#define OCI_LCR_ATTR_TX_NAME                "TX_NAME"
#define OCI_LCR_ATTR_EDITION_NAME           "EDITION_NAME"
#define OCI_LCR_ATTR_MESSAGE_TRACKING_LABEL "MESSAGE_TRACKING_LABEL"

OCILCRFree()

Purpose

Frees the LCR.

Syntax

sword OCILCRFree ( OCISvcCtx   *svchp,
                   OCIError    *errhp, 
                   void        *lcrp,
                   ub4         mode ); 

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

lcrp (IN/OUT)

Streams LCR pointer.

mode (IN)

Specify OCI_DEFAULT.


OCILCRDDLInfoGet()

Purpose

Retrieves specific fields in a DDL LCR.

Syntax

sword OCILCRDDLInfoGet ( OCISvcCtx   *svchp,
                         OCIError    *errhp,
                         oratext     **object_type,
                         ub2         *object_type_len,
                         oratext     **ddl_text,
                         ub4         *ddl_text_len, 
                         oratext     **logon_user,
                         ub2         *logon_user_len,
                         oratext     **current_schema,
                         ub2         *current_schema_len,
                         oratext     **base_table_owner,
                         ub2         *base_table_owner_len,
                         oratext     **base_table_name,
                         ub2         *base_table_name_len,
                         oraub8      *flag,
                         void        *ddl_lcrp,
                         ub4         mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

object_type (OUT)

The type of object on which the DDL statement was executed. (See OCILCRDDLInfoSet().) Optional. If not NULL, then both object_type and object_type_len arguments must not be NULL.

object_type_len (OUT)

Length of the object_type string without the NULL terminator.

ddl_text (OUT)

The text of the DDL statement. Optional. If not NULL, then both ddl_text and ddl_text_len arguments must not be NULL.

ddl_text_len (OUT)

DDL text length in bytes without the NULL terminator.

logon_user (OUT)

Canonicalized (follows a rule or procedure) name of the user whose session executed the DDL statement. Optional. If not NULL, then both logon_user and logon_user_len arguments must not be NULL.

logon_user_len (OUT)

Length of the logon_user string without the NULL terminator.

current_schema (OUT)

The canonicalized schema name that is used if no schema is specified explicitly for the modified database objects in ddl_text. Optional. If not NULL, then both current_schema and current_schema_len arguments must not be NULL.

current_schema_len (OUT)

Length of the current_schema string without the NULL terminator.

base_table_owner (OUT)

If the DDL statement is a table-related DDL (such as CREATE TABLE and ALTER TABLE), or if the DDL statement involves a table (such as creating a trigger on a table), then base_table_owner specifies the canonicalized owner of the table involved. Otherwise, base_table_owner is NULL. Optional. If not NULL, then both base_table_owner and base_table_owner_len arguments must not be NULL.

base_table_owner_len (OUT)

Length of the base_table_owner string without the NULL terminator.

base_table_name (OUT)

If the DDL statement is a table-related DDL (such as CREATE TABLE and ALTER TABLE), or if the DDL statement involves a table (such as creating a trigger on a table), then base_table_name specifies the canonicalized name of the table involved. Otherwise, base_table_name is NULL. Optional. If not NULL, then both base_table_name and base_table_name_len arguments must not be NULL.

base_table_name_len (OUT)

Length of the base_table_name string without the NULL terminator.

flag (OUT)

DDL LCR flag. Optional. Data not returned if argument is NULL. Future extension not used currently.

ddl_lcrp (IN)

DDL LCR. Cannot be NULL.

mode (IN)

Specify OCI_DEFAULT.


OCILCRHeaderGet()

Purpose

Returns the common header fields for row or DDL LCR. All returned pointers point directly to the corresponding LCR fields.

Syntax

sword OCILCRHeaderGet ( OCISvcCtx   *svchp, 
                        OCIError    *errhp, 
                        oratext     **src_db_name,
                        ub2         *src_db_name_len,
                        oratext     **cmd_type,
                        ub2         *cmd_type_len,
                        oratext     **owner,
                        ub2         *owner_len,
                        oratext     **oname,
                        ub2         *oname_len,
                        ub1         **tag,
                        ub2         *tag_len,
                        oratext     **txid,
                        ub2         *txid_len, 
                        OCIDate     *src_time,
                        ub2         *old_columns,
                        ub2         *new_columns,
                        ub1         **position,
                        ub2         *position_len,
                        oraub8      *flag,
                        void        *lcrp,
                        ub4         mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

src_db_name (OUT)

Canonicalized source database name. Must be non-NULL.

src_db_name_len (OUT)

Length of the src_db_name string in bytes excluding the NULL terminator.

cmd_type (OUT)

For row LCRs: One of the following values:


Note:

The values, #define OCI_LCR_ROW_CMD_ROLLBACK and #define OCI_LCR_ROW_CMD_START_TX, is functionality that is available starting with Oracle Database 11g Release 2 (11.2.0.2).

#define OCI_LCR_ROW_CMD_INSERT
#define OCI_LCR_ROW_CMD_DELETE
#define OCI_LCR_ROW_CMD_UPDATE
#define OCI_LCR_ROW_CMD_COMMIT
#define OCI_LCR_ROW_CMD_ROLLBACK
#define OCI_LCR_ROW_CMD_START_TX
#define OCI_LCR_ROW_CMD_LOB_WRITE
#define OCI_LCR_ROW_CMD_LOB_TRIM
#define OCI_LCR_ROW_CMD_LOB_ERASE

For DDL LCRs: One of the command types in Oracle Call Interface Programmer's Guide.

cmd_type_len (OUT)

Length of the cmd_type string in bytes excluding the NULL terminator.

owner (OUT)

Canonicalized table owner name. Must be non-NULL.

owner_len (OUT)

Length of the owner string in bytes excluding the NULL terminator.

oname (OUT)

Canonicalized table name. Must be non-NULL

oname_len (OUT)

Length of the oname string in bytes excluding the NULL terminator.

tag (OUT)

A binary tag that enables tracking of the LCR. For example, you can use this tag to determine the original source database of the DML statement if apply forwarding is used.

tag_len (OUT)

Number of bytes in the tag.

txid (OUT)

Transaction ID. Must be non-NULL

txid_len (OUT)

Length of the string in bytes excluding the NULL terminator.

src_time (OUT)

The time when the change was generated in the redo log file of the source database.

old_columns (OUT)

Number of columns in the OLD column list. Returns 0 if the input LCR is a DDL LCR. Optional.

new_columns (OUT)

Number of columns in the NEW column list. Returns 0 if the input LCR is a DDL LCR. Optional.

position (OUT)

Position for LCR.

position_len (OUT)

Length of position.

flag (OUT)

LCR flag. Possible flags are listed in Comments.

lcrp (IN)

lcrp cannot be NULL.

mode (IN)

OCILCR_NEW_ONLY_MODE - If this mode is specified, then the new_columns returned is the count of the columns in the NEW column list only. Otherwise, the new_columns returned is the number of distinct columns present in either the NEW or the OLD column list of the given row LCR.

Comments

LCR flag.


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

#define OCI_ROWLCR_HAS_ID_KEY_ONLY  /* only has ID key cols */
#define OCI_ROWLCR_SEQ_LCR          /* sequence lcr */

OCILCRRowStmtGet()

Purpose

Returns the generated SQL statement for the row LCR, with values in-lined. Users must preallocate the memory for sql_stmt, and *sql_stmt_len must be set to the size of the allocated buffer, when it is passed in. If *sql_stmt_len is not large enough to hold the generated SQL statement, then an error is raised.

Syntax

sword OCILCRRowStmtGet ( OCISvcCtx   *svchp,
                         OCIError    *errhp,
                         oratext     *row_stmt,
                         ub4         *row_stmt_len,
                         void        *row_lcrp,
                         ub4         mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

row_stmt (IN/OUT)

The generated SQL statement for the row LCR.

row_stmt_len (IN/OUT)

Set to the size of the allocated buffer for row_stmt when passed in; returns the length of row_stmt.

row_lcrp (IN)

Pointer to row LCR.

mode (IN)

Specify OCI_DEFAULT.


OCILCRRowStmtWithBindVarGet()

Purpose

Returns the generated SQL statement, which uses bind variables for column values. The values for the bind variables are returned separately in arrays. You must preallocate the memory for sql_stmt and the arrays, *sql_stmt_len must be set to the size of the allocated buffer, and array_size must be the length of the arrays. The actual column values in bind_var_valuesp points to the values inside the LCR, so it is a shallow copy. If array_size is not large enough to hold all the variables, or if *sql_stmt_len is not large enough to hold the generated SQL statement, then an error is raised.

Syntax

sword OCILCRRowStmtWithBindVarGet ( OCISvcCtx    *svchp,
                                    OCIError     *errhp,
                                    oratext      *row_stmt,
                                    ub4          *row_stmt_len,
                                    ub2          *num_bind_var,
                                    ub2          *bind_var_dtyp,
                                    void         **bind_var_valuesp,
                                    OCIInd       *bind_var_indp,
                                    ub2          *bind_var_alensp,
                                    ub1          *bind_var_csetidp,
                                    ub1          *bind_var_csetfp,
                                    void         *row_lcrp,
                                    oratext      **chunk_column_names,
                                    ub2          *chunk_column_namesl,
                                    oraub8       *chunk_column_flags,
                                    ub2          array_size,
                                    oratext      *bind_var_syntax,
                                    ub4          mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

row_stmt (IN/OUT)

The generated SQL statement for the row LCR.

row_stmt_len (IN/OUT)

Set to the size of the allocated buffer for row_stmt when passed in; returns the length of row_stmt.

num_bind_var (OUT)

The number of bind variables.

bind_var_dtyp (IN/OUT)

Array of data types for the bind variables.

bind_var_valuesp (IN/OUT)

Array of values for the bind variables.

bind_var_indp (IN/OUT)

Array of NULL indicators for the bind variables.

bind_var_alensp (IN/OUT)

Array of lengths for the bind variable values.

bind_var_csetidp (IN/OUT)

Array of character set IDs for the bind variables.

bind_var_csetfp (IN/OUT)

Array of character set forms for the bind variables.

row_lcrp (IN)

Pointer to row LCR.

chunk_column_names (OUT)

Array of LOB column names in LCR.

chunk_column_namesl (OUT)

Array of LOB column name lengths.

chunk_column_flags (OUT)

Array of LOB column flags. Possible flags are listed in Comments.

array_size (IN)

Size of each of the parameter arrays.

bind_var_syntax (IN)

Either (:) (binds are of the form :1, :2, and so on.) or (?) (binds are of the form (?)).

mode (IN)

Specify OCI_DEFAULT.

Comments

The following LCR column flags can be combined using bitwise OR operator.

#define OCI_LCR_COLUMN_LOB_DATA     /* column contains LOB data */
#define OCI_LCR_COLUMN_LONG_DATA    /* column contains long data */
#define OCI_LCR_COLUMN_EMPTY_LOB    /* column has an empty LOB  */
#define OCI_LCR_COLUMN_LAST_CHUNK   /* last chunk of current column */
#define OCI_LCR_COLUMN_AL16UTF16    /* column is in AL16UTF16 fmt */
#define OCI_LCR_COLUMN_NCLOB        /* column has NCLOB data */
#define OCI_LCR_COLUMN_XML_DATA     /* column contains xml data */
#define OCI_LCR_COLUMN_XML_DIFF     /* column contains xmldiff data */
#define OCI_LCR_COLUMN_ENCRYPTED    /* column is encrypted */
#define OCI_LCR_COLUMN_UPDATED      /* col is updated */
/* OCI_LCR_COLUMN_UPDATED is set only for the modified columns in the NEW
 * column list of an update LCR.
 */ 

OCILCRNew()

Purpose

Constructs a new Streams LCR object of the specified type (ROW or DDL) for the given duration.

Syntax

sword OCILCRNew ( OCISvcCtx     *svchp, 
                  OCIError      *errhp, 
                  OCIDuration   duration, 
                  ub1           lcrtype,
                  void          **lcrp,
                  ub4           mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

duration (IN)

Memory for the LCR is allocated for this specified duration.

lcrtype (IN)

LCR type. Values are:

#define OCI_LCR_XROW
#define OCI_LCR_XDDL
lcrp (IN/OUT)

If *lcrp is not NULL, an error is raised.

mode (IN)

Specify OCI_DEFAULT.

Comments

Note:

  • After creation, you are not allowed to change the type of the LCR (ROW or DDL) or duration of the memory allocation.

  • Use OCILCRHeaderSet() to populate common header fields for row or DDL LCR.

  • After the LCR header is initialized, use OCILCRRowColumnInfoSet() or OCILCRDDLInfoSet() to populate operation specific elements. Use OCILCRExtraAttributesSet() to populate extra attribute information.

  • Use OCILCRFree() to free the LCR created by this function.


OCILCRRowColumnInfoGet()

Purpose

Returns the column fields in a row LCR.

Syntax

sword OCILCRRowColumnInfoGet ( OCISvcCtx   *svchp, 
                               OCIError    *errhp, 
                               ub2         column_value_type,
                               ub2         *num_columns,
                               oratext     **column_names,
                               ub2         *column_name_lens,
                               ub2         *column_dtyp,
                               void        **column_valuesp,
                               OCIInd      *column_indp,
                               ub2         *column_alensp,
                               ub1         *column_csetfp,
                               oraub8      *column_flags,
                               ub2         *column_csid,
                               void        *row_lcrp,
                               ub2         array_size,
                               ub4         mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

column_value_type (IN)

ROW LCR column value type; either of:

#define OCI_LCR_ROW_COLVAL_OLD
#define OCI_LCR_ROW_COLVAL_NEW
num_columns (OUT)

Number of columns in the specified column array.

column_names (OUT)

An array of column name pointers.

column_name_lens (OUT)

An array of column name lengths.

column_dtyp (OUT)

An array of column data types. Optional. Data is not returned if column_dtyp is NULL.

column_valuesp (OUT)

An array of column data pointers.

column_indp (OUT)

An array of indicators.

column_alensp (OUT)

An array of column lengths. Each returned element is the length in bytes.

column_csetfp (OUT)

An array of character set forms for the columns. Optional. Data is not returned if the argument is NULL.

column_flags (OUT)

An array of column flags. Optional. Data is not returned if the argument is NULL. See Comments for the values.

column_csid (OUT)

An array of character set IDs for the columns.

row_lcrp (IN)

row_lcrp cannot be NULL.

array_size (IN)

Size of each of the parameter arrays. An error is returned if array_size is less than the number of columns in the requested column list. The actual size of the requested column list is returned through the num_columns parameter.

mode (IN)

OCILCR_NEW_ONLY_MODE - If this mode is specified, then the new_columns returned is the count of the columns in the NEW column list only. Otherwise, the new_columns returned is the number of distinct columns present in either the NEW or the OLD column list of the given row LCR.

Comments

  • For INSERT, this function must only be called to get the NEW column values.

  • For DELETE, this function must only be called to get the OLD column values.

  • For UPDATE, this function can be called twice, once to get the NEW column values and once to get the OLD column values.

  • This function must not be called for COMMIT operations.

The following LCR column flags can be combined using bitwise OR operator.

#define OCI_LCR_COLUMN_LOB_DATA     /* column contains LOB data */
#define OCI_LCR_COLUMN_LONG_DATA    /* column contains long data */
#define OCI_LCR_COLUMN_EMPTY_LOB    /* column has an empty LOB  */
#define OCI_LCR_COLUMN_LAST_CHUNK   /* last chunk of current column */
#define OCI_LCR_COLUMN_AL16UTF16    /* column is in AL16UTF16 fmt */
#define OCI_LCR_COLUMN_NCLOB        /* column has NCLOB data */
#define OCI_LCR_COLUMN_XML_DATA     /* column contains xml data */
#define OCI_LCR_COLUMN_XML_DIFF     /* column contains xmldiff data */
#define OCI_LCR_COLUMN_ENCRYPTED    /* column is encrypted */
#define OCI_LCR_COLUMN_UPDATED      /* col is updated */
/* OCI_LCR_COLUMN_UPDATED is set only for the modified columns in the NEW
 * column list of an update LCR.
 */ 

Table 11-3 lists the currently supported table column data types. For each data type, it lists the corresponding LCR column data type, the C program variable type to cast the LCR column value, and the OCI functions that can manipulate the column values returned from OCILCRRowColumnInfoGet().

Table 11-3 Table Column Data Types

Table Column Data TypesLCR Column Data TypeProgram VariableConversion Function

VARCHAR, NVARCHAR2

SQLT_CHR

char *


NUMBER

SQLT_VNU

OCINumber

OCINumberToInt()

OCINumberToReal()

OCINumberToText()

DATE

SQLT_ODT

OCIDate

OCIDateToText()

Can access structure directly to get date and time fields.

RAW

SQLT_BIN

unsigned char *


CHAR, NCHAR

SQLT_AFC

char *


BINARY_FLOAT

SQLT_BFLOAT

float


BINARY_DOUBLE

SQLT_BDOUBLE

double


TIMESTAMP

SQLT_TIMESTAMP

OCIDateTime *

OCIDateTimeGetTime()

OCIDateTimeGetDate()

OCIDateTimeGetTimeZoneOffset()

OCIDateTimeToText()

TIMESTAMP WITH TIME ZONE

SQLT_TIMESTAMP_TZ

OCIDateTime *

OCIDateTimeGetTime()

OCIDateTimeGetDate()

OCIDateTimeGetTimeZoneOffset()

OCIDateTimeToText()

TIMESTAMP WITH LOCAL TIME ZONE

SQLT_TIMESTAMP_LTZ

OCIDateTime *

OCIDateTimeGetTime()

OCIDateTimeGetDate()

OCIDateTimeGetTimeZoneOffset()

OCIDateTimeToText()

INTERVAL YEAR TO MONTH

SQLT_INTERVAL_YM

OCIInterval *

OCIIntervalToText()

OCIIntervalGetYearMonth()

INTERVAL DAY TO SECOND

SQLT_INTERVAL_DS

OCIInterval *

OCIIntervalToText()

OCIIntervalGetDaySecond()

UROWID

SQLT_RDD

OCIRowid *

OCIRowidToChar()

CLOB

SQLT_CHR or SQLT_BIN

unsigned char *

*


NCLOB

SQLT_BIN

unsigned char *

*


BLOB

SQLT_BIN

unsigned char *

*


LONG

SQLT_CHR

char *

*


LONG RAW

SQLT_BIN

unsigned char *

*



* Call OCIXStreamOutChunkReceive() to get column data.


OCILCRRowColumnInfoSet()

Purpose

Populates column fields in a row LCR.

Syntax

sword OCILCRRowColumnInfoSet ( OCISvcCtx   *svchp, 
                               OCIError    *errhp, 
                               ub2         column_value_type,
                               ub2         num_columns,
                               oratext     **column_names,
                               ub2         *column_name_lens,
                               ub2         *column_dtyp,
                               void        **column_valuesp,
                               OCIInd      *column_indp,
                               ub2         *column_alensp,
                               ub1         *column_csetfp,
                               oraub8      *column_flags,
                               ub2         *column_csid,
                               void        *row_lcrp,
                               ub4         mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

column_value_type (IN)

ROW LCR Column value types:

#define OCI_LCR_ROW_COLVAL_OLD
#define OCI_LCR_ROW_COLVAL_NEW
num_columns (IN)

Number of columns in each of the array parameters.

column_names (IN)

Pointer to an array of column names. Column names must be canonicalized. Column names must follow Oracle Database naming conventions and size limitations.

column_name_lens (IN)

Pointer to an array of column name lengths.

column_dtyp (IN)

Pointer to an array of column data types. See Comments for valid data types.

column_valuesp (IN)

Pointer to an array of column data pointers.

column_indp (IN)

Pointer to an indicator array. For all data types, this is a pointer to an array of OCIInd values (OCI_IND_NULL or OCI_IND_NOTNULL).

column_alensp (IN)

Pointer to an array of actual column lengths in bytes.

column_csetfp (IN)

Pointer to an array of character set forms for the columns. The default form is SQLCS_IMPLICIT. Setting this attribute causes the database or national character set to be used on the client side. Set this attribute to SQLCS_NCHAR for the national character set or SQLCS_IMPLICIT for the database character set. Pass 0 for non-character columns.

column_flags (IN)

Pointer to an array of column flags. (See Comments for the list of valid LCR column flags.)

column_csid (IN)

Pointer to an array of character set IDs for the columns.

row_lcrp (IN/OUT)

row_lcrp cannot be NULL.

mode (IN)

Specify OCI_DEFAULT.

Comments

Note:

  • For INSERT, this function must only be called to specify the NEW column values.

  • For DELETE, this function must only be called to specify the OLD column values.

  • For UPDATE, this function can be called twice, once to specify the NEW column values and once to specify the OLD column values.

  • This function must not be called for COMMIT operations.

The following LCR column flags can be combined using the bitwise OR operator.

#define OCI_LCR_COLUMN_LOB_DATA     /* column contains LOB data */
#define OCI_LCR_COLUMN_LONG_DATA    /* column contains long data */
#define OCI_LCR_COLUMN_EMPTY_LOB    /* column has an empty LOB  */
#define OCI_LCR_COLUMN_LAST_CHUNK   /* last chunk of current column */
#define OCI_LCR_COLUMN_AL16UTF16    /* column is in AL16UTF16 fmt */
#define OCI_LCR_COLUMN_NCLOB        /* column has NCLOB data */
#define OCI_LCR_COLUMN_XML_DATA     /* column contains xml data */
#define OCI_LCR_COLUMN_XML_DIFF     /* column contains xmldiff data */
#define OCI_LCR_COLUMN_ENCRYPTED    /* column is encrypted */
#define OCI_LCR_COLUMN_UPDATED      /* col is updated */
/* OCI_LCR_COLUMN_UPDATED is set only for the modified columns in the NEW
 * column list of an update LCR.
 */ 

Valid data types are:

SQLT_AFC           SQLT_TIMESTAMP
SQLT_DAT           SQLT_TIMESTAMP_TZ
SQLT_BFLOAT        SQLT_TIMESTAMP_LTZ
SQLT_BDOUBLE       SQLT_INTERVAL_YM
SQLT_NUM           SQLT_INTERVAL_DS
SQLT_VCS
SQLT_ODT
SQLT_INT
SQLT_BIN
SQLT_CHR
SQLT_RDD
SQLT_VST
SQLT_INT
SQLT_FLT

OCILCRDDLInfoSet()

Purpose

Populates DDL-specific fields in a DDL LCR.

Syntax

sword OCILCRDDLInfoSet ( OCISvcCtx    *svchp,
                         OCIError     *errhp,
                         oratext      *object_type,
                         ub2          object_type_len,
                         oratext      *ddl_text,
                         ub4          ddl_text_len, 
                         oratext      *logon_user,
                         ub2          logon_user_len,
                         oratext      *current_schema,
                         ub2          current_schema_len,
                         oratext      *base_table_owner,
                         ub2          base_table_owner_len,
                         oratext      *base_table_name,
                         ub2          base_table_name_len,
                         oraub8       flag,
                         void         *ddl_lcrp,
                         ub4          mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

object_type (IN)

The type of object on which the DDL statement was executed. See Comments for the valid object types.

object_type_len (IN)

Length of the object_type string without the NULL terminator.

ddl_text (IN)

The text of the DDL statement. This parameter must be set to a non-NULL value. DDL text must be in Oracle Database DDL format.

ddl_text_len (IN)

DDL text length in bytes without the NULL terminator.

logon_user (IN)

Canonicalized name of the user whose session executed the DDL statement.

logon_user_len (IN)

Length of the logon_user string without the NULL terminator. Must follow Oracle Database naming conventions and size limitations.

current_schema (IN)

The canonicalized schema name that is used if no schema is specified explicitly for the modified database objects in ddl_text. If a schema is specified in ddl_text that differs from the one specified for current_schema, then the function uses the schema specified in ddl_text.

This parameter must be set to a non-NULL value.

current_schema_len (IN)

Length of the current_schema string without the NULL terminator. Must follow Oracle Database naming conventions and size limitations.

base_table_owner (IN)

If the DDL statement is a table-related DDL (such as CREATE TABLE or ALTER TABLE), or if the DDL statement involves a table (such as creating a trigger on a table), then base_table_owner specifies the canonicalized owner of the table involved. Otherwise, base_table_owner is NULL.

base_table_owner_len (IN)

Length of the base_table_owner string without the NULL terminator. Must follow Oracle Database naming conventions and size limitations.

base_table_name (IN)

If the DDL statement is a table-related DDL (such as CREATE TABLE or ALTER TABLE), or if the DDL statement involves a table (such as creating a trigger on a table), then base_table_name specifies the canonicalized name of the table involved. Otherwise, base_table_name is NULL.

base_table_name_len (IN)

Length of the base_table_name without the NULL terminator. Must follow Oracle Database naming conventions and size limitations.

flag (IN)

DDL LCR flag. (Not currently used; used for future extension.) Specify OCI_DEFAULT.

ddl_lcrp (IN/OUT)

ddl_lcrp cannot be NULL.

mode (IN)

Specify OCI_DEFAULT.

Comments

The following are valid object types:

CLUSTER
FUNCTION
INDEX
OUTLINE
PACKAGE
PACKAGE BODY
PROCEDURE
SEQUENCE
SYNONYM
TABLE
TRIGGER
TYPE
USER
VIEW

NULL is also a valid object type. Specify NULL for all object types not listed.


OCILCRHeaderSet()

Purpose

Initializes the common header fields for row or DDL LCR.

Syntax

sword OCILCRHeaderSet ( OCISvcCtx  *svchp,
                        OCIError   *errhp,
                        oratext    *src_db_name,
                        ub2        src_db_name_len,
                        oratext    *cmd_type,
                        ub2        cmd_type_len,
                        oratext    *owner,
                        ub2        owner_len,
                        oratext    *oname,
                        ub2        oname_len,
                        ub1        *tag,
                        ub2        tag_len,
                        oratext    *txid,
                        ub2        txid_len,
                        OCIDate    *src_time,
                        ub1        *position,
                        ub2        position_len,
                        oraub8     flag,
                        void       *lcrp,
                        ub4        mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

src_db_name (IN)

Canonicalized source database name. Must be non-NULL.

src_db_name_len (IN)

Length of the src_db_name string in bytes excluding the NULL terminator. Must follow Oracle Database naming conventions and size limitations.

cmd_type (IN)

For row LCRs: One of the following values:


Note:

The values, #define OCI_LCR_ROW_CMD_ROLLBACK and #define OCI_LCR_ROW_CMD_START_TX, are available starting with Oracle Database 11g Release 2 (11.2.0.2).

#define OCI_LCR_ROW_CMD_INSERT
#define OCI_LCR_ROW_CMD_DELETE
#define OCI_LCR_ROW_CMD_UPDATE
#define OCI_LCR_ROW_CMD_COMMIT
#define OCI_LCR_ROW_CMD_ROLLBACK
#define OCI_LCR_ROW_CMD_START_TX
#define OCI_LCR_ROW_CMD_LOB_WRITE
#define OCI_LCR_ROW_CMD_LOB_TRIM
#define OCI_LCR_ROW_CMD_LOB_ERASE

For DDL LCRs: One of the command types in Oracle Call Interface Programmer's Guide.

cmd_type_len (IN)

Length of cmd_type.

owner (IN)

Canonicalized table owner name. Owner is not required for COMMIT LCR.

owner_len (IN)

Length of the owner string in bytes excluding the NULL terminator. Must follow Oracle Database naming conventions and size limitations.

oname (IN)

Canonicalized table name. Owner is not required for COMMIT LCR.

oname_len (IN)

Length of the oname string in bytes excluding the NULL terminator. Must follow Oracle Database naming conventions and size limitations.

tag (IN)

A binary tag that enables tracking of the LCR. For example, you can use this tag to determine the original source database of the DML statement if apply forwarding is used.

tag_len (IN)

Number of bytes in the tag. Cannot exceed 2000 bytes.

txid (IN)

Transaction ID. Must be non-NULL.

txid_len (IN)

Length of the txid string in bytes, excluding the NULL terminator. Must follow Oracle Database naming conventions and size limitations.

src_time (IN)

The time when the change was generated in the online redo log file of the source database.

position (IN)

Position for LCR. Must be non-NULL and byte-comparable.

position_len (IN)

Length of position. Must be greater than zero.

flag (IN)

LCR flag. Possible flags are listed in Comments.

lcrp (IN/OUT)

lcrp cannot be NULL.

mode (IN)

Specify OCI_DEFAULT.

Comments

Note:

  • This function sets all internal fields of the LCR to NULL including extra attributes.

  • This function does not deep copy the passed-in values. You must ensure data is valid for the duration of the LCR.

  • For COMMIT LCRs, owner and oname information are not required. Provide valid values for src_db_name, cmd_type, tag, txid, and position.

  • For row LCRs, use OCILCRRowColumnInfoSet() to populate row LCR-specific column information.

  • For DDL LCRs, use OCILCRDDLInfoSet() to populate DDL operation specific information.

  • For row or DDL LCRs, use OCILCRAttributesSet() to populate extra attribute information.

The following are LCR flags:


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

#define OCI_ROWLCR_HAS_ID_KEY_ONLY  /* only has ID key cols */
#define OCI_ROWLCR_SEQ_LCR          /* sequence lcr */

OCILCRLobInfoGet()

Purpose

Returns the LOB information for a piece-wise LOB LCR generated from a DBMS_LOB or OCILob procedure.

Syntax

sword OCILCRLobInfoGet ( OCISvcCtx   *svchp, 
                         OCIError    *errhp, 
                         oratext     **column_name,
                         ub2         *column_name_len,
                         ub2         *column_dty,
                         oraub8      *column_flag,
                         ub4         *offset,
                         ub4         *size,
                         void        *row_lcrp,
                         ub4         mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

column_name (OUT)

LOB column name.

column_name_len (OUT)

Length of LOB column name.

column_dty (OUT)

Column data type (either SQLT_CHR or SQLT_BIN).

column_flag (OUT)

Column flag. See Comments in "OCILCRRowColumnInfoSet()".

offset (OUT)

LOB operation offset in code points. Only returned for LOB WRITE and LOB TRIM operations. This is the same as the offset parameter for OCILobErase() or the offset parameter in OCILobWrite().

size (OUT)

LOB operation size in code points. Only returned for LOB TRIM and LOB ERASE operations. This is the same as the new_length parameter in OCILobTrim() or the amtp parameter in OCILobErase().

row_lcrp (IN)

Pointer to a row LCR.

mode (IN)

Specify OCI_DEFAULT.

Comments

Returns OCI_SUCCESS or OCI_ERROR.


OCILCRLobInfoSet()

Purpose

Sets the LOB information for a piece-wise LOB LCR. This call is valid when the input LCR is a LOB_WRITE, LOB_ERASE, or LOB_TRIM; otherwise, an error is returned.

Syntax

sword OCILCRLobInfoSet ( OCISvcCtx   *svchp, 
                         OCIError    *errhp, 
                         oratext     *column_name,
                         ub2         column_name_len,
                         ub2         column_dty,
                         oraub8      column_flag,
                         ub4         offset,
                         ub4         size,
                         void        *row_lcrp,
                         ub4         mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

column_name (IN)

LOB column name.

column_name_len (IN)

Length of LOB column name.

column_dty (IN)

Column data type (either SQLT_CHR or SQLT_BIN).

column_flag (IN)

Column flag. See Comments in "OCILCRRowColumnInfoSet()".

offset (IN)

LOB operation offset in code points. Only required for LOB WRITE and LOB TRIM operations. This is the same as the soffset parameter for OCILobErase() or the offset parameter in OCILobWrite().

size (IN)

LOB operation size in code points. Only required for LOB TRIM and LOB ERASE operations.This is the same as the new_length parameter in OCILobTrim() or the amtp parameter in OCILobErase().

row_lcrp (IN/OUT)

Pointer to a row LCR.

mode (IN)

Specify OCI_DEFAULT.

Comments

Returns OCI_SUCCESS or OCI_ERROR.


OCILCRSCNsFromPosition()

Purpose

Returns the SCN and the commit SCN from the position value. The input position must be one that is obtained from an XStream outbound server. An error is returned if the input position does not conform to the expected format.

Syntax

sword OCILCRSCNsFromPosition ( OCISvcCtx   *svchp, 
                               OCIError    *errhp, 
                               ub1         *position,
                               ub2         position_len,
                               OCINumber   *scn,
                               OCINumber   *commit_scn,
                               ub4         mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

position (IN)

LCR position value.

position_len (IN)

Length of LCR position value.

scn (OUT)

SCN number embedded in the given LCR position.

commit_scn (OUT)

The commit SCN embedded in the given position.

mode (IN)

Mode flags used for future expansion. Specify OCI_DEFAULT.


OCILCRSCNToPosition()

Purpose

Converts an SCN to a position. The generated position can be passed as the last_position to OCIXStreamOutAttach() to filter the LCRs with commit SCN less than the given SCN and the LCR's SCN less than the given SCN. Therefore, the first LCR sent by the outbound server is either:

  • A commit LCR at the given SCN, or

  • The first LCR of the subsequent transaction with commit SCN greater than or equal to the given SCN.

Syntax

sword OCILCRSCNToPosition ( OCISvcCtx  *svchp,
                            OCIError   *errhp,
                            ub1        *position,
                            ub2        *position_len,
                            OCINumber  *scn,
                            ub4        mode );

Parameters

svchp (IN)

OCI service context.

errhp (IN)

OCI error handle.

position (OUT)

The resulting position. You must preallocate OCI_LCR_MAX_POSITION_LEN bytes.

position_len (OUT)

Length of position.

scn (IN)

The SCN to be stored in position.

mode (IN)

Mode flags (Not currently used; used for future extension).

Comments

Returns OCI_SUCCESS if the conversion succeeds, OCI_ERROR otherwise.


OCILCRWhereClauseGet()

Purpose

Gets the WHERE clause statement for the given row LCR.

Syntax

sword OCILCRWhereClauseGet ( OCISvcCtx  *svchp,
                             OCIError   *errhp,
                             oratext    *wc_stmt,
                             ub4        *wc_stmt_len,
                             void       *row_lcrp,
                             ub4        mode );

Parameters

svchp (IN/OUT)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

wc_stmt (OUT)

SQL statement equivalent to the LCR.

wc_stmt_len (IN/OUT)

Length of the wc_stmt buffer.

row_lcrp (IN)

Row LCR to be converted to SQL.

mode (IN)

Mode flags used for future expansion. Specify OCI_DEFAULT.

Comments

The WHERE clause generated for an INSERT LCR has all the columns that are being inserted. This WHERE clause could be used to identify the inserted row after it is inserted, for example, like "returning ROWID".

INSERT INTO TAB(COL1) VALUES (10) -> WHERE COL1=10

The WHERE clause generated for UPDATE has all the columns in the old column list. However, the values of the columns are that of the new value if it exists in the new column list of the UPDATE. If the column does not have a new value, then the old column value is used.

UPDATE TAB SET COL1 = 10 WHERE COL1 = 20 -> WHERE COL1 = 10
UPDATE TAB SET COL2 = 20 WHERE COL1 = 20 -> WHERE COL1 = 20

The WHERE clause for DELETE uses the columns and values from the old column list.

LOB piecewise operations use the new columns and values for generating the WHERE clause.

Returns

OCI_SUCCESS or OCI_ERROR.


OCILCRWhereClauseWithBindVarGet()

Purpose

Gets the WHERE clause statement with bind variables for the given row LCR.

Syntax

sword OCILCRWhereClauseWithBindVarGet ( OCISvcCtx  *svchp,
                                        OCIError   *errhp,
                                        oratext    *wc_stmt,
                                        ub4        *wc_stmt_len,
                                        ub2        *num_bind_var,
                                        ub2        *bind_var_dtyp,
                                        void       **bind_var_valuesp,
                                        OCIInd     *bind_var_indp,
                                        ub2        *bind_var_alensp,
                                        ub2        *bind_var_csetidp,
                                        ub1        *bind_var_csetfp,
                                        void       *row_lcrp,
                                        ub2        array_size,
                                        oratext    *bind_var_syntax,
                                        ub4        mode ); 

Parameters

svchp (IN/OUT)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

wc_stmt (OUT)

SQL statement equivalent to the LCR.

wc_stmt_len (IN/OUT)

Length of the wc_stmt buffer.

num_bind_var (OUT)

Number of bind variables.

bind_var_dtyp (OUT)

Array of data types of bind variables.

bind_var_valuesp (OUT)

Array of values of bind variables.

bind_var_indp (OUT)

Array of NULL indicators of bind variables.

bind_var_alensp (OUT)

Array of lengths of bind values.

bind_var_csetidp (OUT)

Array of char set IDs of binds.

bind_var_csetfp (OUT)

Array of char set forms of binds.

row_lcrp (IN)

Row LCR to be converted to SQL.

array_size (IN)

Size of the array of bind values.

bind_var_syntax (IN)

Native syntax to be used for binds.

mode (IN)

Mode flags for future expansion. Specify OCI_DEFAULT.

Comments

If array_size is not large enough to accommodate the number of columns in the requested column list, then OCI_ERROR is returned. The expected array_size is returned through the num_bind_var parameter.

bind_var_syntax for Oracle Database should contain (:). This generates positional binds such as :1, :2, :3, and so on. For non-Oracle databases input the string that must be used for binds.

The WHERE clause generated for INSERT LCR has all the columns that are being inserted. This WHERE clause can identify the inserted row after it is inserted, for example, like "returning ROWID".

INSERT INTO TAB(COL1) VALUES (10) -> WHERE COL1=10

The WHERE clause generated for UPDATE has all the columns in the old column list. However, the values of the columns are that of the new column value of the column if it exists in the new values of the UPDATE. If the column appears only in the old column, then the old column value is used.

UPDATE TAB SET COL1 = 10 WHERE COL1 = 20 -> WHERE COL1 = 10
UPDATE TAB SET COL2 = 20 WHERE COL1 = 20 -> WHERE COL1 = 20

The WHERE clause for DELETE uses the columns and values from the old column list.

LOB piecewise operations use the new columns and values for generating the WHERE clause.

Returns

OCI_SUCCESS or OCI_ERROR.


OCIXStreamInAttach()

Purpose

Attaches to an inbound server. The client application must connect to the database using a dedicated connection.

Syntax

sword OCIXStreamInAttach ( OCISvcCtx  *svchp,
                           OCIError   *errhp,
                           oratext    *server_name,
                           ub2        server_name_len,
                           oratext    *source_name,
                           ub2        source_name_len,
                           ub1        *last_position,
                           ub2        *last_position_len,
                           ub4        mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

server_name (IN)

XStream inbound server name.

server_name_len (IN)

Length of the XStream inbound server name.

source_name (IN)

Source name to identify the data source.

source_name_len (IN)

Source name length.

last_position (OUT)

Last position received by inbound server. Optional. If specified, then you must preallocate OCI_LCR_MAX_POSITION_LEN bytes for the return value.

last_position_len (OUT)

Length of last_position. Must be non-NULL if last_position is non-NULL.

mode (IN)

Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

OCIXSTREAM_IN_ATTACH_RESTART_INBOUND - If this mode is specified, then this function can notify the server to restart the inbound server regardless of whether it is in a disabled or aborted state. If you do not pass in this mode and the inbound server is in an aborted state when this call is made, then the function returns an error.

Comments

The name of the inbound server must be provided because multiple inbound servers can be configured in one Oracle instance. This function returns OCI_ERROR if any error is encountered while attaching to the inbound server. Only one client can attach to an XStream inbound server at any time. An error is returned if multiple clients attempt to attach to the same inbound server or if the same client attempts to attach to multiple inbound servers concurrently.

This function returns the last position received by the inbound server. Having successfully attached to the server, the client should resume sending LCRs with positions greater than this last_position since the inbound server discards all LCRs with positions less than or equal to the last_position.

Returns either OCI_SUCCESS or OCI_ERROR status code.


OCIXStreamInDetach()

Purpose

Detaches from the inbound server.

Syntax

sword OCIXStreamInDetach ( OCISvcCtx  *svchp,
                           OCIError   *errhp,
                           ub1        *processed_low_position,
                           ub2        *processed_low_position_len,
                           ub4        mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

processed_low_position (OUT)

The server's processed low position.

processed_low_position (OUT)

Length of processed_low_position.

mode (IN)

Specify OCI_DEFAULT.

Comments

You must pass in a preallocated buffer for the position argument. The maximum length of this buffer is OCI_LCR_MAX_POSITION_LEN. This position is exposed in DBA_XSTREAM_INBOUND_PROGRESS view

This call returns the server's processed low position. If this function is invoked while a OCIXStreamInLCRSend() call is in progress, then it immediately terminates that call before detaching from the inbound server.

Returns either OCI_SUCCESS or OCI_ERROR status code.


OCIXStreamInLCRSend()

Purpose

Sends an LCR stream from the client to the attached inbound server. To avoid a network round-trip for every OCIXStreamInLCRSend() call, the connection is tied to this call and terminates the call after an ACK interval since the LCR stream is initiated to the server.

Syntax

sword OCIXStreamInLCRSend ( OCISvcCtx   *svchp,
                            OCIError    *errhp,
                            void        *lcrp,
                            ub1         lcrtype,
                            oraub8      flag,
                            ub4         mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

lcrp (IN)

Pointer to the new LCR to send. It cannot be NULL.

lcrtype (IN)

LCR type. Either of:

#define OCI_LCR_XROW
#define OCI_LCR_XDDL
flag (IN)

If bit OCI_XSTREAM_MORE_ROW_DATA (0x01) is set, then LCR contains more chunk data. You must call OCIXStreamInChunkSend() before calling OCIXStreamInLCRSend() again.

mode (IN)

Specify OCI_DEFAULT.

Comments

Return codes are:

  • OCI_STILL_EXECUTING means that the current call is still in progress. The connection associated with the specified service context handle is still tied to this call for streaming the LCRs to the server. An error is returned if you attempt to use the same connection to execute any OCI calls that require database round-trip, for example, OCIStmtExecute(), OCIStmtFetch(), OCILobRead(), and so on. OCILCR* calls are local calls; thus, they are valid while this call is in progress.

  • OCI_SUCCESS means the current call is completed. You can execute OCIStmt*, OCILob*, and so on from the same service context.

  • OCI_ERROR means this call encounters some errors. Use OCIErrorGet() to obtain information about the error.


OCIXStreamInLCRCallbackSend()

Purpose

Sends an LCR stream to the attached inbound server. You must specify a callback to construct each LCR for streaming. If some LCRs contain chunk data, then a second callback must be provided to create each chunk data.

Syntax

sword OCIXStreamInLCRCallbackSend ( 
          OCISvcCtx                       *svchp, 
          OCIError                        *errhp,
          OCICallbackXStreamInLCRCreate   createlcr_cb, 
          OCICallbackXStreamInChunkCreate createchunk_cb, 
          void                            *usrctxp,
          ub4                             mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

createlcr_cb (IN)

Client callback procedure to be invoked to generate an LCR for streaming. Cannot be NULL.

createchunk_cb (IN)

Client callback procedure to be invoked to create each chunk. Can be NULL if you do not need to send any LCR with LOB or LONG or XMLType columns. OCI_ERROR is returned if this argument is NULL and you attempt to send an LCR with additional chunk data.

usrctxp (IN)

User context to pass to both callback functions.

mode (IN)

Specify OCI_DEFAULT fore now.

Comments

Return code: OCI_ERROR or OCI_SUCCESS.

The createlcr_cb argument must be of type OCICallbackXStreamInLCRCreate:

typedef sb4  (*OCICallbackXStreamInLCRCreate)
              void  *usrctxp, void **lcrp, ub1 *lcrtyp, oraub8 *flag);

Parameters of OCICallbackXStreamInLCRCreate():

usrctxp (IN/OUT)

Pointer to the user context.

lcrp (OUT)

Pointer to the LCR to be sent.

lcrtyp (OUT)

LCR type (OCI_LCR_XROW or OCI_LCR_XDDL).

flag (OUT)

If OCI_XSTREAM_MORE_ROW_DATA is set, then the current LCR has more chunk data.

The input parameter to the callback is the user context. The output parameters are the new LCR, its type, and a flag. If the generated LCR contains additional chunk data, then this flag must have the OCI_XSTREAM_MORE_ROW_DATA (0x01) bit set. The valid return codes from the OCICallbackXStreamInLCRCreate() callback function are OCI_CONTINUE or OCI_SUCCESS. This callback function must return OCI_CONTINUE to continue processing the OCIXStreamInLCRCallbackSend() call. Any return code other than OCI_CONTINUE signals that the client wants to terminate the OCIXStreamInLCRCallbackSend() call immediately. In addition, a NULL LCR returned from the OCICallbackXStreamInLCRCreate() callback function signals that the client wants to terminate the current call.

The createchunk_cb argument must be of type OCICallbackXStreamInChunkCreate:

typedef sb4 (*OCICallbackXStreamInChunkCreate)
void     *usrctxp,
oratext  **column_name,
ub2      *column_name_len,
ub2      *column_dty,
oraub8   *column_flag,
ub2      *column_csid,
ub4      *chunk_bytes,
ub1      **chunk_data,
oraub8   *flag);

The input parameters of the createchunk_cb() procedure are the user context and the information about the chunk.

Parameters of OCICallbackXStreamInChunkCreate():

usrctxp (IN/OUT)

Pointer to the user context.

column_name (OUT)

Column name of the current chunk.

column_name_len (OUT)

Length of the column name.

column_name_dty (OUT)

Chunk data type (SQLT_CHR or SQLT_BIN).

column_flag (OUT)

See Comments in "OCIXStreamInChunkSend()".

column_csid (OUT)

Column character set ID. Relevant only if the column is an XMLType column (that is, column_flag has the OCI_LCR_COLUMN_XML_DATA bit set).

chunk_bytes (OUT)

Chunk data length in bytes.

chunk_data (OUT)

Chunk data pointer.

flag (OUT)

If OCI_XSTREAM_MORE_ROW_DATA is set, then the current LCR has more chunk data.

The OCIXStreamInLCRCallbackSend() function invokes the createlcr_cb() procedure to obtain each LCR to send to the server. If the return flag from the createlcr_cb() procedure has the OCI_XSTREAM_MORE_ROW_DATA bit set, then it invokes the createchunk_cb() procedure to obtain each chunk. It repeatedly calls the createchunk_cb() procedure while the flag returned from this callback has the OCI_XSTREAM_MORE_ROW_DATA bit set. When this bit is not set, this function cycles back to invoke the createlcr_cb() procedure to get the next LCR. This cycle is repeated until the createlcr_cb() procedure returns a NULL LCR or when at the transaction boundary after an ACK interval has elapsed since the call began.

The valid return codes from the OCICallbackXStreamInChunkCreate() callback function are OCI_CONTINUE or OCI_SUCCESS. This callback function must return OCI_CONTINUE to continue processing the OCIXStreamInLCRCallbackSend() call. Any return code other than OCI_CONTINUE signals that the client wants to terminate the OCIXStreamInLCRCallbackSend() call immediately.

Because terminating the current call flushes the network and incurs another network round-trip in the next call, you must avoid returning a NULL LCR immediately when there is no LCR to send. Doing this can greatly reduce network throughput and affect performance. During short idle periods, you can add some delays in the callback procedure instead of returning a NULL LCR immediately to avoid flushing the network too frequently.

Figure 11-1 shows the execution flow of the OCIXStreamInLCRCallbackSend() function.

Figure 11-1 Execution Flow of the OCIXStreamInLCRCallbackSend() Function

Description of Figure 11-1 follows
Description of "Figure 11-1 Execution Flow of the OCIXStreamInLCRCallbackSend() Function"

* While OCI_XSTREAM_MORE_ROW_DATA is set

Description of Figure 11-1:

  • At 1, the user invokes the OCIXStreamInLCRCallbackSend() providing two callbacks. This function initiates an LCR inbound stream to the server.

  • At 2, this function invokes the createlcr_cb() procedure to get an LCR from the callback to send to the server. If the return LCR is NULL, then this function exits.

  • If the flag from 2 indicates the current LCR has more data (that is, the OCI_XSTREAM_MORE_ROW_DATA bit is set), then this function proceeds to 3; otherwise, it loops back to 2 to get the next LCR.

  • At 3, this function invokes createchunk_cb() to get the chunk data to send to the server. If the flag from this callback has the OCI_XSTREAM_MORE_ROW_DATA bit set, then it repeats 3; otherwise, it loops back to 2 to get the next LCR from the user. If any callback function returns any values other than OCI_CONTINUE, then the OCIXStreamInLCRCallbackSend() call terminates.

    Following is a sample client pseudocode snippet for callback mode (error checking is not included for simplicity):

    main
    {
       /* Attach to inbound server */
       OCIXStreamInAttach();
     
       /* Get the server's processed low position to determine
        * the position of the first LCR to generate.
        */
       OCIXStreamInProcessedLWMGet(&lwm);
     
       while (TRUE)
       {
          /* Initiate LCR inbound stream */
          OCIXStreamInLCRCallbackSend(createlcr_cb, createchunk_cb);
     
          OCIXStreamInProcessedLWMGet(&lwm);
     
          if (some terminating condition)
             break;
       }
       OCIXStreamInDetach(&lwm);
    }
     
     
    createlcr_cb (IN usrctx, OUT lcr, OUT flag)
    {
       if (have more LCRs to send)
       {
          /* construct lcr */
          OCILCRHeaderSet(lcr);
          OCILCRRowColumnInfoSet(lcr);
     
          if (lcr has LOB | LONG | XMLType columns)
             Set OCI_XSTREAM_MORE_ROW_DATA flag;
     
          if (lcr is LOB_ERASE | LOB_TRIM | LOB_WRITE)
             OCILCRLobInfoSet(lcr);
       }
       else if (idle timeout expires)
       {
          lcr = null;
       }
    }
     
    createchunk_cb (IN usrctx, OUT chunk, OUT flag)
    {
       /* set col_name, col_flag, chunk data, and so on */
       construct_chunk;
     
       if (last chunk of current column)
       {
          set col_flag |= OCI_LCR_COLUMN_LAST_CHUNK;
     
          if (last column)
             clear OCI_XSTREAM_MORE_ROW_DATA flag;
       }
    }
    

OCIXStreamInProcessedLWMGet()

Purpose

Gets the local processed low position that is cached at the client. This function can be called anytime while the client is attached to an XStream inbound server. Clients, using the callback mode to stream LCRs to the server (see "OCIXStreamInLCRCallbackSend()"), can invoke this function while in the callback procedures.

Syntax

sword OCIXStreamInProcessedLWMGet ( OCISvcCtx  *svchp,
                                    OCIError   *errhp,
                                    ub1        *processed_low_position,
                                    ub2        *processed_low_position_len,
                                    ub4        mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

processed_low_position (OUT)

The processed low position maintained at the client.

processed_low_position_len (OUT)

Length of processed_low_position.

mode (IN)

Specify OCI_DEFAULT.

Comments

After attaching to an XStream inbound server, a local copy of the server's processed low position (see "OCIXStreamOutProcessedLWMSet()") is cached at the client. This local copy is refreshed with the server's low position when each of the following calls returns OCI_SUCCESS:

  • OCIXStreamInAttach()

  • OCIXStreamInLCRSend()

  • OCIXStreamInLCRCallbackSend()

  • OCIXStreamInFlush()

Return code: OCI_ERROR or OCI_SUCCESS.

You must pass in a preallocated buffer for the position argument. The maximum length of this buffer is OCI_LCR_MAX_POSITION_LEN. This position is exposed in the DBA_XSTREAM_INBOUND_PROGRESS view.

The client can use this position to periodically purge the logs used to generate the LCRs at or below this position.


OCIXStreamInErrorGet()


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

Purpose

Returns the first error encountered by the inbound server since the OCIXStreamInAttach() call.

Syntax

sword OCIXStreamInErrorGet ( OCISvcCtx *svchp,
                             OCIError  *errhp,
                             sb4       *errcodep,
                             oratext   *msgbuf,
                             ub2       msg_bufsize,
                             ub2       *msg_len,
                             oratext   *txn_id,
                             ub2       txn_id_bufsize,
                             ub2       *txn_id_len );

Parameters

svchp (IN/OUT)

OCI service handle.

errhp (IN/OUT)

Error Handle.

errcodep (OUT)

Error code.

msgbuf (IN/OUT)

Preallocated message buffer.

msg_bufsize (IN)

Message buffer size.

msg_len (OUT)

Length of returned error message.

txn_id (IN/OUT)

Preallocated transaction ID buffer.

txn_id_bufsize (IN)

The transaction ID buffer size.

txn_id_len (OUT)

Length of the returned transaction ID.

Comments

The maximum size for the returned transaction ID is OCI_LCR_MAX_TXID_LEN. If the allocated buffer for txn_id is too small, then this routine returns ORA-29258. The maximum size for the returned error msg is OCI_ERROR_MAXMSG_SIZE. If the allocated size for msgbuf is too small, then the returned message is truncated.


OCIXStreamInFlush()

Purpose

Used to flush the network while attaching to an XStream inbound server. It terminates any in-progress OCIXStreamInLCRSend() call associated with the specified service context.

Syntax

sword OCIXStreamInFlush ( OCISvcCtx    *svchp, 
                          OCIError     *errhp,
                          ub4          mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

mode (IN)

Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

OCIXSTREAM_IN_FLUSH_WAIT_FOR_COMPLETE - If this mode is specified, then this function flushes the network, and then waits for all complete and rollback transactions that have been sent to the inbound server to complete before returning control to the client.

Comments

Return code: OCI_ERROR or OCI_SUCCESS.

Each call incurs a database round-trip to get the server's processed low position, which you can retrieve afterward using OCIXStreamInProcessedLWMGet(). Call this function only when there is no LCR to send to the server and the client wants to know the progress of the attached inbound server.

This call returns OCI_ERROR if it is invoked from the callback functions of OCIXStreamInLCRCallbackSend().


OCIXStreamInChunkSend()

Purpose

Sends a chunk to the inbound server. This function is valid during the execution of the OCIXStreamInLCRSend() call.

Syntax

sword OCIXStreamInChunkSend (  OCISvcCtx   *svchp,
                               OCIError    *errhp,
                               oratext     *column_name,
                               ub2         column_name_len,
                               ub2         column_dty,
                               oraub8      column_flag,
                               ub2         column_csid,
                               ub4         chunk_bytes,
                               ub1         *chunk_data,
                               oraub8      flag,
                               ub4         mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

column_name (IN)

Name of column associated with the given data. Column name must be canonicalized and must follow Oracle Database naming convention.

column_name_len (IN)

Length of column name.

column_dty (IN)

LCR chunk data type (must be SQLT_CHR or SQLT_BIN). See Table 11-5, "Storage of LOB or LONG Data in the LCR"

column_flag (IN)

Column flag. (See Comments for valid column flags.) Must specify OCI_LCR_COLUMN_LAST_CHUNK for the last chunk of each LOB or LONG or XMLType column.

column_csid (IN)

Column character set ID. This is required only if the column_flag has OCI_LCR_COLUMN_XML_DATA bit set.

chunk_bytes (IN)

Chunk data length in bytes.

chunk_data (IN)

Pointer to column data chunk. If the column is NCLOB or varying width CLOB, then the input chunk data must be in AL16UTF16 format. The chunk data must be in the character set defined in "Storage of LOB or LONG Data in the LCR".

flag (IN)

If OCI_XSTREAM_MORE_ROW_DATA (0x01) bit is set, then the current row change contains more data. You must clear this bit when sending the last chunk of the current LCR.

mode (IN)

Specify OCI_DEFAULT.

Comments

The following LCR column flags can be combined using bitwise OR operator.

#define OCI_LCR_COLUMN_LOB_DATA     /* column contains LOB data */
#define OCI_LCR_COLUMN_LONG_DATA    /* column contains long data */
#define OCI_LCR_COLUMN_EMPTY_LOB    /* column has an empty LOB  */
#define OCI_LCR_COLUMN_LAST_CHUNK   /* last chunk of current column */
#define OCI_LCR_COLUMN_AL16UTF16    /* column is in AL16UTF16 fmt */
#define OCI_LCR_COLUMN_NCLOB        /* column has NCLOB data */
#define OCI_LCR_COLUMN_XML_DATA     /* column contains xml data */
#define OCI_LCR_COLUMN_XML_DIFF     /* column contains xmldiff data */
#define OCI_LCR_COLUMN_ENCRYPTED    /* column is encrypted */
#define OCI_LCR_COLUMN_UPDATED      /* col is updated */

In Streams, LOB, LONG, or XMLType column data is broken up into multiple chunks. For a row change containing columns of these data types, its associated LCR only contains data for the other column types. All LOB, LONG or XMLType columns are either represented in the LCR as NULL or not included in the LCR as defined in Table 11-4, "Required Column List in the First LCR".

OCILCRRowColumnInfoSet() is provided to generate a list of scalar columns in an LCR. For LOB, LONG, and XMLType columns, OCIXStreamInChunkSend() is provided to set the value of each chunk in a column. For a large column, this function can be invoked consecutively multiple times with smaller chunks of data. The XStream inbound server can assemble these chunks and apply the accumulated change to the designated column.

The LCR of a row change must contain all the scalar columns that can uniquely identify a row at the apply site. Table 11-4 describes the required column list in each LCR for each DML operation.

Table 11-4 Required Column List in the First LCR

Command Type of the First LCR of a Row ChangeColumns Required in the First LCR

INSERT

The NEW column list must contain all non-NULL scalar columns. All LOB, XMLType, and LONG columns with chunk data must be included in this NEW column list. Each must have NULL value and OCI_LCR_COLUMN_EMPTY_LOB flag specified.

UPDATE

The OLD column list must contain the key columns.

The NEW column list must contain all updated scalar columns. All LOB, XMLType, and LONG columns with chunk data must be included in this NEW column list. Each must have NULL value and OCI_LCR_COLUMN_EMPTY_LOB flag specified.

DELETE

The OLD column list must contain the key columns.

LOB_WRITE, LOB_TRIM, LOB_ERASE

The NEW column list must contain the key columns and the modified LOB column.


After constructing each LCR, you can call OCIXStreamInLCRSend() to send that LCR. Afterward, OCIXStreamInChunkSend() can be called repeatedly to send the chunk data for each LOB or LONG or XMLType column in that LCR. Sending the chunk value for different columns cannot be interleaved. If a column contains multiple chunks, then this function must be called consecutively using the same column name before proceeding to a new column. The ordering of the columns is irrelevant.

When invoking this function, you must pass OCI_XSTREAM_MORE_ROW_DATA as the flag argument if there is more data for the current LCR. When sending the last chunk of the current LCR, then this flag must be cleared to signal the end of the current LCR.

This function is valid only for INSERT, UPDATE, and LOB_WRITE operations. Multiple LOB, LONG, or XMLType columns can be specified for INSERT and UPDATE, while only one LOB column is allowed for LOB_WRITE operation.

The following is a sample client pseudocode snippet for non-callback mode (error checking is not included for simplicity):

main
{
   /* Attach to inbound server */
   OCIXStreamInAttach();
 
   /* Get the server's processed low position to determine
    * the position of the first LCR to generate.
    */
   OCIXStreamInProcessedLWMGet(&lwm);
 
   while (TRUE)
   {
      flag = 0;
      /* construct lcr */
      OCILCRHeaderSet(lcr);
      OCILCRRowColumnInfoSet(lcr);
 
      if (lcr has LOB | LONG | XMLType columns)
         set OCI_XSTREAM_MORE_ROW_DATA flag;
 
      status = OCIXStreamInLCRSend(lcr, flag);
 
      if (status == OCI_STILL_EXECUTING &&
             (OCI_XSTREAM_MORE_ROW_DATA flag set))
      {
         for each LOB/LONG/XMLType column in row change
         {
            for each chunk in column
            {
               /* set col_name, col_flag, chunk data */
               construct chunk;
 
               if (last chunk of current column)
                   col_flag |= OCI_LCR_COLUMN_LAST_CHUNK;
 
               if (last chunk of last column)
                  clear OCI_XSTREAM_MORE_ROW_DATA flag;
 
               OCIXStreamInChunkSend(chunk, col_flag, flag);
            }
         }
      }
      else if (status == OCI_SUCCESS)
      {
         /* get lwm when SendLCR call ends successfully. */
         OCIXStreamInProcessedLWMGet(&lwm);
      }
 
      if (some terminating_condition)
        break;
   }
 
   OCIXStreamInDetach();
}

OCIXStreamInCommit()


Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

Purpose

Commits the given transaction. This function lets the client notify the inbound server about a transaction that has been executed by the client rather than by the server. So that if the same transaction is retransmitted during apply restart, it is ignored by the inbound server. A commit LCR must be supplied for the inbound server to extract the transaction ID and the position of the commit.

Syntax

sword OCIXStreamInCommit ( OCISvcCtx *svchp,
                           OCIError  *errhp,
                           void      *lcrp,
                           ub4       mode );

Parameters

svchp (IN/OUT)

OCI service handle.

errhp (IN/OUT)

Error Handle to which errors should be reported.

lcrp (IN)

Pointer to the LCR to send. Must be a commit LCR.

mode (IN)

Mode flags. Not used currently; used for future extension.

Comments

The position of the input LCR must be higher than DBA_XSTREAM_INBOUND_PROGRESS.APPLIED_HIGH_POSITION, and the LCR's source database must match DBA_APPLY_PROGRESS.SOURCE_DATABASE of the attached inbound server.

If there is any pre-commit handler defined, it is executed when this commit LCR is executed.

Assume a sample use case in which a situation where the inbound server does not support certain data types, but the client can do the work directly. The client performs the transaction changes directly to the database and then invokes the OCIXStreamInCommit() to commit the transaction by way of the inbound server. Note that the client should not directly commit the transaction itself. Rather, the transaction changes are committed with this command (OCIXStreamInCommit()) so that the transaction is atomic. Thus, if the inbound server becomes disabled during the client transaction, then the entire transaction is correctly rolled back.


OCIXStreamOutAttach()

Purpose

Attaches to an XStream outbound server. The client application must connect to the database using a dedicated connection.

Syntax

sword OCIXStreamOutAttach ( OCISvcCtx   *svchp,
                            OCIError    *errhp,
                            oratext     *server_name,
                            ub2         server_name_len,
                            ub1         *last_position,
                            ub2         last_position_len,
                   0zυ         ub4         mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

server_name (IN)

XStream outbound server name.

server_name_len (IN)

Length of XStream outbound server name.

last_position (IN)

Position to the last received LCR. Can be NULL.

last_position_len (IN)

Length of last_position.

mode (IN)

Note:

This functionality is available starting with Oracle Database 11g Release 2 (11.2.0.2).

OCIXSTREAM_OUT_ATTACH_APP_FREE_LCR - If this mode is specified, then the application is in charge of freeing the LCRs from the outbound server.

Comments

The OCIEnv environment handle must be created with OCI_OBJECT mode, and the service context must be in a connected state to issue this function. This function does not support nonblocking mode. It returns either the OCI_SUCCESS or OCI_ERROR status code.

The name of the outbound server must be provided because multiple outbound servers can be configured in one Oracle Database instance. This function returns OCI_ERROR if it encounters any error while attaching to the outbound server. Only one client can attach to an XStream outbound server at any time. An error is returned if multiple clients attempt to attach to the same outbound server or if the same client attempts to attach to multiple outbound servers using the same service handle.

The last_position parameter is used to establish the starting point of the stream. This call returns OCI_ERROR if the specified position is non-NULL and less than the server's processed low position (see "OCIXStreamOutProcessedLWMSet()"); otherwise, LCRs with positions greater than the specified last_position are sent to the user.

If the last_position is NULL, then the stream starts from the processed low position maintained in the server.


OCIXStreamOutDetach()

Purpose

Detaches from the outbound server.

Syntax

sword OCIXStreamOutDetach ( OCISvcCtx   *svchp,
                            OCIError    *errhp,
                            ub4         mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle that you can pass to OCIErrorGet() for diagnostic information in case of an error.

mode (IN)

Specify OCI_DEFAULT.

Comments

This function sends the current local processed low position to the server before detaching from the outbound server. The outbound server automatically restarts after this call. This function returns OCI_ERROR if it is invoked while a OCIXStreamOutReceive() call is in progress.


OCIXStreamOutLCRReceive()

Purpose

Receives an LCR from an outbound stream. If an LCR is available, then this function immediately returns that LCR. The duration of each LCR is limited to the interval between two successive OCIXStreamOutLCRReceive() calls. When there is no LCR available in the stream, this call returns a NULL LCR after an idle timeout.

Syntax

sword OCIXStreamOutLCRReceive ( OCISvcCtx     *svchp, 
                                OCIError      *errhp, 
                                void          **lcrp,
                                ub1           *lcrtype,
                                oraub8        *flag,
                                ub1           *fetch_low_position,
                                ub2           *fetch_low_position_len,
                                ub4           mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

lcrp (OUT)

Pointer to the LCR received from the stream. If there is an available LCR, then this LCR is returned with status code OCI_STILL_EXECUTING. When the call ends, a NULL LCR is returned with status code OCI_SUCCESS.

lcrtype (OUT)

Type of the retrieved LCR. This value is valid only when lcrp is not NULL.

flag (OUT)

Return flag. If bit OCI_XSTREAM_MORE_ROW_DATA (0x01) is set, then this LCR has more data. You must use OCIXStreamOutReceiveChunk() function to get the remaining data.

fetch_low_position (OUT)

XStream outbound server's fetch low position. This value is returned only when the return code is OCI_SUCCESS. Optional. If non-NULL, then you must preallocate OCI_LCR_MAX_POSITION_LEN bytes for the return value.

fetch_low_position_len (OUT)

Length of fetch_low_position.

mode (IN)

Specify OCI_DEFAULT.

Comments

To avoid a network round-trip for every OCIXStreamOutLCRReceive() call, the connection is tied to this call and allows the server to fill up the network buffer with LCRs so subsequent calls can quickly receive the LCRs from the network. The server ends each call at the transaction boundary after an ACK interval elapses since the call began. When there is no LCR in the stream, the server ends the call after the idle timeout elapses.

Return codes:

  • OCI_STILL_EXECUTING means that the current call is still in progress. The connection associated with the specified service context handle is still tied to this call for streaming the LCRs from the server. An error is returned if you attempt to use the same connection to execute any OCI calls that require database round-trip, for example, OCIStmtExecute(), OCIStmtFetch(), OCILobRead(), and so on. OCILCR* calls do not require round-trips; thus, they are valid while the call is in progress.

  • OCI_SUCCESS means that the current call is completed. You are free to execute OCIStmt*, OCILob*, and so on from the same service context.

  • OCI_ERROR means the current call encounters some errors. Use OCIErrorGet() to obtain information about the error.

This call always returns a NULL LCR when the return code is OCI_SUCCESS. In addition, it returns the fetch low position to denote that the outbound server has received all transactions with commit position lower than or equal to this value.


See Also:



OCIXStreamOutLCRCallbackReceive()

Purpose

Used to get the LCR stream from the outbound server using callbacks. You must supply a callback procedure to be invoked for each LCR received. If some LCRs in the stream may contain LOB or LONG or XMLType columns, then a second callback must be supplied to process each chunk (see "OCIXStreamOutChunkReceive()").

Syntax

sword OCIXStreamOutLCRCallbackReceive ( 
           OCISvcCtx                           *svchp, 
           OCIError                            *errhp,    
           OCICallbackXStreamOutLCRProcess     processlcr_cb,
           OCICallbackXStreamOutChunkProcess   processchunk_cb,
           void                                *usrctxp,
           ub1                                 *fetch_low_position,   
           ub2                                 *fetch_low_position_len,
           ub4                                 mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

processlcr_cb (IN)

Callback function to process each LCR received by the client. Cannot be NULL.

processchunk_cb (IN)

Callback function to process each chunk in the received LCR. Can be NULL if you do not expect to receive any LCRs with additional chunk data.

usrctxp (IN)

User context to pass to both callback procedures.

fetch_low_position (OUT)

XStream outbound server's fetch low position (see "OCIXStreamOutLCRReceive()"). Optional.

fetch_low_position_len (OUT)

Length of fetch_low_position.

mode (IN)

Specify OCI_DEFAULT.

Comments

Return code: OCI_SUCCESS or OCI_ERROR.

The processlcr_cb argument must be of type OCICallbackXStreamOutLCRProcess:

typedef sb4  (*OCICallbackXStreamOutLCRProcess) 
               (void  *usrctxp, void *lcrp, ub1 lcrtyp, oraub8 flag);

Parameters of OCICallbackXStreamOutLCRProcess():

usrctxp (IN/OUT)

Pointer to the user context.

lcrp (IN)

Pointer to the LCR just received.

lcrtyp (IN)

LCR type (OCI_LCR_XROW or OCI_LCR_XDDL).

flag (IN)

If OCI_XSTREAM_MORE_ROW_DATA is set, then the current LCR has more chunk data.

The input parameters of the processlcr_cb() procedure are the user context, the LCR just received, its type, and a flag to indicate whether the LCR contains more data. If there is an LCR available, then this callback is invoked immediately. If there is no LCR in the stream, after an idle timeout, then this call ends with OCI_SUCCESS return code. The valid return codes from the OCICallbackXStreamOutLCRProcess() callback function are OCI_CONTINUE or OCI_SUCCESS. This callback function must return OCI_CONTINUE to continue processing the OCIXStreamOutLCRCallbackReceive() call. Any return code other than OCI_CONTINUE signals that the client wants to terminate OCIXStreamOutLCRCallbackReceive() immediately.

The processchunk_cb argument must be of type OCICallbackXStreamOutChunkProcess:

typedef sb4  (*OCICallbackXStreamOutChunkProcess)
(void        *usrctxp, 
oratext      *column_name,
ub2          column_name_len,
ub2          column_dty,
oraub8       column_flag,
ub2          column_csid,
ub4          chunk_bytes,
ub1          *chunk_data,
oraub8       flag );

Parameters of OCICallbackXStreamOutChunkProcess():

usrctxp (IN/OUT)

Pointer to the user context.

column_name (IN)

Column name of the current chunk.

column_name_len (IN)

Length of the column name.

column_name_dty (IN)

Chunk data type (SQLT_CHR or SQLT_BIN).

column_flag (IN)

See Comments in "OCIXStreamInChunkSend()".

column_csid (IN)

Column character set ID. Relevant only if the column is an XMLType column (that is, column_flag has the OCI_LCR_COLUMN_XML_DATA bit set).

chunk_bytes (IN)

Chunk data length in bytes.

chunk_data (IN)

Chunk data pointer.

flag (IN)

If OCI_XSTREAM_MORE_ROW_DATA is set, then the current LCR has more chunk data.

The input parameters of the processchunk_cb() procedure are the user context, the information about the chunk, and a flag. When the flag argument has the OCI_XSTREAM_MORE_ROW_DATA (0x01) bit set, then there is more data for the current LCR. The valid return codes from the OCICallbackXStreamOutChunkProcess() callback function are OCI_CONTINUE or OCI_SUCCESS. This callback function must return OCI_CONTINUE to continue processing the OCIXStreamOutLCRCallbackReceive() call. Any return code other than OCI_CONTINUE signals that the client wants to terminate OCIXStreamOutLCRCallbackReceive() immediately.

OCI calls are provided to access each field in the LCR. If the LCR contains only scalar column(s), then the duration of that LCR is limited only to the processlcr_cb() procedure. If the LCR contains some chunk data, then the duration of the LCR is extended until all the chunks have been processed. If you want to access the LCR data at a later time, then a copy of the LCR must be made before it is freed.

As for OCIXStreamOutLCRReceive(), the server ends each call at the transaction boundary after each ACK interval since the call began, or after each idle timeout. The default ACK interval is 30 seconds, and the default idle timeout is one second. See "Server Handle Attributes" to tune these values. This function also returns the fetch low position when the call ends.

Figure 11-2 shows the execution flow of the OCIXStreamOutLCRCallbackReceive() function.

Figure 11-2 Execution Flow of the OCIXStreamOutLCRCallbackReceive() Function

Description of Figure 11-2 follows
Description of "Figure 11-2 Execution Flow of the OCIXStreamOutLCRCallbackReceive() Function"

* While OCI_XSTREAM_MORE_ROW_DATA is set.

Description of Figure 11-2:

  • At 1, the client invokes OCIXStreamOutLCRCallbackReceive() providing two callbacks. This function initiates an LCR outbound stream from the server.

  • At 2, this function receives an LCR from the stream and invokes processlcr_cb() procedure with the LCR just received. It passes OCI_XSTREAM_MORE_ROW_DATA flag to processlcr_cb() if the current LCR has additional data.

  • If the current LCR has no additional chunk, then this function repeats 2 for the next LCR in the stream.

  • At 3, if the current LCR contains additional chunk data, then this function invokes processchunk_cb() for each chunk received with the OCI_XSTREAM_MORE_ROW_DATA flag. This flag is cleared when the callback is invoked on the last chunk of the current LCR.

  • If there is more LCR in the stream, then it loops back to 2. This process continues until the end of the current call, or when there is no LCR in the stream for one second, or if a callback function returns any value other than OCI_CONTINUE.

Here is sample pseudocode for callback mode:


main
{
   /* Attach to outbound server specifying last position */
   OCIXStreamOutAttach(last_pos);
 
   /* Update the local processed low position */
   OCIXStreamOutProcessedLWMSet(lwm);
 
   while (TRUE)
   {
      OCIXStreamOutLCRCallbackReceive(processlcr_cb,
                                      processchunk_cb, fwm);
 
      /* Use fetch low position(fwm)
       * to update processed lwm if applied.
       */
 
      /* Update the local lwm so it is sent to
       * server during next call.
       */
      OCIXStreamOutProcessedLWMSet(lwm);
      if (some terminating_condition)
         break;
   }
   OCIXStreamOutDetach();
}
 
processlcr_cb (IN lcr, IN flag)
{
   /* Process the LCR just received */
   OCILCRHeaderGet(lcr);
   OCILCRRowColumnInfoGet(lcr);
 
   if (lcr is LOB_WRITE | LOB_TRIM | LOB_ERASE)
      OCILCRLobInfoGet(lcr);
 
   if (OCI_XSTREAM_MORE_ROW_DATA flag set)
      prepare_for_chunk_data;
   else
      process_end_of_row;
}
 
processchunk_cb (IN chunk, IN flag)
{
   process_chunk;
 
   if (OCI_XSTREAM_MORE_ROW_DATA flag not set)
      process_end_of_row;
}

OCIXStreamOutProcessedLWMSet()

Purpose

Updates the local copy of the processed low position. This function can be called anytime between OCIXStreamOutAttach() and OCIXStreamOutDetach() calls. Clients using the callback mechanism to stream LCRs from the server (see "OCIXStreamOutLCRCallbackReceive()"), can invoke this function while in the callback procedures.

Syntax

sword OCIXStreamOutProcessedLWMSet ( OCISvcCtx  *svchp, 
                                     OCIError   *errhp, 
                                     ub1        *processed_low_position,
                                     ub2        processed_low_position_len,
                                     ub4        mode );

Parameters

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

processed_low_position (IN)

The processed low position maintained at the client.

processed_low_position_len (IN)

Length of processed_low_position.

mode (IN)

Specify OCI_DEFAULT.

Comments

The processed low position denotes that all LCRs at or below it have been processed. After successfully attaching to an XStream outbound server, a local copy of the processed low position is maintained at the client. Periodically, this position is sent to the server so that archived redo log files containing already processed transactions can be purged.

Return code: OCI_SUCCESS or OCI_ERROR.

Clients using XStreamOut functions must keep track of the processed low position based on what they have processed and call this function whenever their processed low position has changed. This is done so that a more current value is sent to the server during the next update, which occurs at the beginning of the OCIXStreamOutLCRCallbackReceive() and OCIXStreamDetach() calls. For an OCIXStreamOutLCRReceive() call, the processed low position is sent to the server when it initiates a request to start the outbound stream. It is not sent while the stream is in progress.

You can query the DBA_XSTREAM_OUTBOUND_PROGRESS view to confirm that the processed low position has been saved in the server.


OCIXStreamOutChunkReceive()

Purpose

Allows the client to retrieve the data of each LOB or LONG or XMLType column one chunk at a time.

Syntax

sword OCIXStreamOutChunkReceive ( OCISvcCtx   *svchp, 
                                  OCIError    *errhp,
                                  oratext     **column_name,
                                  ub2         *column_name_len,
                                  ub2         *column_dty,
                                  oraub8      *column_flag,
                                  ub2         *column_csid,
                                  ub4         *chunk_bytes,
                                  ub1         **chunk_data,
                                  oraub8      *flag,
                                  ub4         mode );

Syntax

svchp (IN)

Service handle context.

errhp (IN/OUT)

An error handle you can pass to OCIErrorGet() for diagnostic information in case of an error.

column_name (OUT)

Name of the column that has data.

column_name_len (OUT)

Length of the column name.

column_dty (OUT)

Column chunk data type (either SQLT_CHR or SQLT_BIN).

column_flag (OUT)

Column flag. See Comments for valid flags.

column_csid (OUT)

Column character set ID. This is returned only for XMLType column, that is, column_flag has OCI_LCR_COLUMN_XML_DATA bit set.

chunk_bytes (OUT)

Number of bytes in the returned chunk.

chunk_data (OUT)

Pointer to the chunk data in the LCR. The client must not deallocate this buffer since the LCR and its contents are maintained by this function.

flag (OUT)

If OCI_XSTREAM_MORE_ROW_DATA (0x01) is set, then the current LCR has more chunks coming.

mode (IN)

Specify OCI_DEFAULT.

Comments

In Streams, LOB, LONG, or XMLType column data is broken up into multiple LCRs based on how they are stored in the online redo log files. Thus, for a row change containing these columns multiple LCRs may be constructed. The first LCR of a row change contains the column data for all the scalar columns. All LOB or LONG or XMLType columns in the first LCR are set to NULL because their data are sent in subsequent LCRs for that row change. These column data are stored in the LCR as either RAW (SQLT_BIN) or VARCHAR2 (SQLT_CHR) chunks as shown in the table Table 11-5.

Table 11-5 Storage of LOB or LONG Data in the LCR

Source Column Data TypeStreams LCR Data TypeStreams LCR Character Set

BLOB

RAW

N/A

Fixed-width CLOB

VARCHAR2

Client Character Set

Varying-width CLOB

RAW

AL16UTF16

NCLOB

RAW

AL16UTF16

XMLType

RAW

column csid obtained from the chunk


In Streams, LOB, LONG, or XMLType column data is broken up into multiple chunks based on how they are stored in the online redo log files. For a row change containing columns of these data types, its associated LCR only contains data for the other scalar columns. All LOB, LONG, or XMLType columns are either represented in the LCR as NULL or not included in the LCR. The actual data for these columns are sent following each LCR as RAW (SQLT_BIN) or VARCHAR2 (SQLT_CHR) chunks as shown in Table 11-5, "Storage of LOB or LONG Data in the LCR".

The following LCR column flags can be combined using the bitwise OR operator.

#define OCI_LCR_COLUMN_LOB_DATA     /* column contains LOB data */
#define OCI_LCR_COLUMN_LONG_DATA    /* column contains long data */
#define OCI_LCR_COLUMN_EMPTY_LOB    /* column has an empty LOB  */
#define OCI_LCR_COLUMN_LAST_CHUNK   /* last chunk of current column */
#define OCI_LCR_COLUMN_AL16UTF16    /* column is in AL16UTF16 fmt */
#define OCI_LCR_COLUMN_NCLOB        /* column has NCLOB data */
#define OCI_LCR_COLUMN_XML_DATA     /* column contains xml data */
#define OCI_LCR_COLUMN_XML_DIFF     /* column contains xmldiff data */
#define OCI_LCR_COLUMN_ENCRYPTED    /* column is encrypted */
#define OCI_LCR_COLUMN_UPDATED      /* col is updated */

Return code: OCI_ERROR or OCI_SUCCESS.

This call returns a NULL column name and NULL chunk data if it is invoked when the current LCR does not contain the LOB, LONG, or XMLType columns. This function is valid only when an OCIXStreamOutLCRReceive() call is in progress. An error is returned if it is called during other times.

If the return flag from OCIXStreamOutLCRReceive() has OCI_XSTREAM_MORE_ROW_DATA bit set, then you must iteratively call OCIXStreamOutChunkReceive() to retrieve all the chunks belonging to that row change before getting the next row change (that is, before making the next OCIXStreamOutLCRReceive() call); otherwise, an error is returned.

Here is sample pseudocode for non-callback mode:

main
{
   /* Attach to outbound server specifying last position */
   OCIXStreamOutAttach(last_pos);
 
   /* Update the local processed low position */
   OCIXStreamOutProcessedLWMSet(lwm);
 
   while (TRUE)
   {
      status = OCIXStreamOutLCRReceive(lcr, flag, fwm);
 
      if (status == OCI_STILL_EXECUTING)
      {
         /* Process LCR just received */
         OCILCRHeaderGet(lcr);
         OCILCRRowColumnInfoGet(lcr);
 
         while (OCI_XSTREAM_MORE_ROW_DATA flag set)
         {
            OCIXStreamReceiveChunk(chunk, flag, );
 
            process_chunk;
         }
         process_end_of_row;
      }
      else if (status == OCI_SUCCESS)
      {
         /* Use fetch low position(fwm)
          * to update processed lwm if applied.
          */
 
         /* Update the local lwm so it is sent to
          * server during next call.
          */
         OCIXStreamOutProcessedLWMSet(lwm);
 
          if (some terminating_condition)
            break;
       }
   }
   OCIXStreamOutDetach();
}
PKIz0zPK "8Aoa,mimetypePK"8AVdHC:iTunesMetadata.plistPK"8AYuMETA-INF/container.xmlPK"8A̢OEBPS/xstrm_pt_views.htmPK"8A@;*9% OEBPS/xstrm_dp_views.htmPK"8AG:BOEBPS/xstrm_mon.htmPK"8A[pTODOEBPS/cover.htmPK"8A ՋOEBPS/xstrm_config.htmPK"8A6yOEBPS/title.htmPK"8A"@& &OEBPS/xstrm_cncpt.htmPK"8A$ongOEBPS/xstrm_trouble.htmPK"8A[۵PK#OEBPS/xstrm_pt_oci.htmPK"8AC*OEBPS/xstrm_pt_concepts.htmPK"8A0OEBPS/preface.htmPK"8Ad--MOEBPS/xstrm_use.htmPK"8AxC_{OEBPS/index.htmPK"8A5. RROEBPS/img/xstrm078.gifPK"8AK MjHjPOEBPS/img/xstrm071.gifPK"8AUPPyOEBPS/img/xstrm073.gifPK"8AFA00 OEBPS/img/xstrm064.gifPK"8AutSSm=OEBPS/img/xstrm063.gifPK"8AY8v&&dOEBPS/img/xstrm070.gifPK"8AY͡__OEBPS/img/xstrm077.gifPK"8AL=i--z OEBPS/img/xstrm045.gifPK"8A\\E OEBPS/img/xstrm508.gifPK"8A9G@B@֢ OEBPS/img/xstrm074.gifPK"8A *z*a OEBPS/img/xstrm012.gifPK"8AEE$ OEBPS/img/xstrm075.gifPK"8A|u>9.T OEBPS/img/xstrm069.gifPK"8A#4@/@r OEBPS/img/xstrm076.gifPK"8ALiz0P+P( OEBPS/img/xstrm044.gifPK"8AP΍## OEBPS/img/xstrm072.gifPK"8A. m' OEBPS/img_text/xstrm076.htmPK"8AE`-* OEBPS/img_text/xstrm070.htmPK"8A_Χ- OEBPS/img_text/xstrm075.htmPK"8A֊0 OEBPS/img_text/xstrm508.htmPK"8AXr>93 OEBPS/img_text/xstrm074.htmPK"8Aj|9 OEBPS/img_text/xstrm078.htmPK"8A^kMU= OEBPS/img_text/xstrm012.htmPK"8A1ph&/*9@ OEBPS/img_text/xstrm077.htmPK"8A!C OEBPS/img_text/xstrm069.htmPK"8AGE OEBPS/img_text/xstrm045.htmPK"8AR H OEBPS/img_text/xstrm064.htmPK"8A/K OEBPS/img_text/xstrm044.htmPK"8A\oz:M OEBPS/img_text/xstrm071.htmPK"8A%ЫV OEBPS/img_text/xstrm073.htmPK"8Aq[ OEBPS/img_text/xstrm072.htmPK"8AQup^ OEBPS/img_text/xstrm063.htmPK"8A?==b OEBPS/xstrm_intro.htmPK"8AQ  OEBPS/xstrm_pt_admin.htmPK"8A$Bc"T" OEBPS/xstrm_man.htmPK"8A}ZlUla OEBPS/xstrm_auth.htmPK"8AP"hh6 OEBPS/xstrm_xstream_adm.htmPK"8Az OEBPS/xstrm_static_views.htmPK"8A