TABLE | MAP

有效对象

TABLE 对于提取是有效的。只能将 TABLE 与 Replicat 配合使用,并且可以使用 EVENTACTIONS 参数。MAP 在某些情况下对 Extract 和 Replicat 有效。有关详细信息,请参见 MAP for Extract 。

说明

TABLE 和 MAP 参数控制要受 Oracle GoldenGate 进程影响的对象的选择、映射和操作。这些参数的工作方式如下:

TABLE 和 MAP 对于初始负载配置以及配置为支持复制事务性更改的联机进程有效。

可以使用 TABLE 和 MAP 处理以下对象:

要指定按提取捕获的序列,请使用 SEQUENCE 参数。

注:Oracle GoldenGate 支持复制 Oracle 实体化视图的实际数据值。

可以使用参数文件中的一个或多个 TABLE 或 MAP 语句(带或不带通配符)指定要处理的所有对象。

可以使用以下参数从通配符 TABLE 或 MAP 语句中排除对象:

默认值

无

TABLE 的语法

对于表,可以使用所有 TABLE 选项。对于非表对象,仅使用 TABLE 指定要捕获的对象。

TABLE <source_table>[, TARGET <target_table>]
[, ATTRCHARSET (<charset>)]
[, CHARSET <character_set>]
[, COLCHARSET <character_set>]
[, COLMAP (<column_mapping>)]
[, {COLS | COLSEXCEPT} (<column_list>)]
[, {DEF | TARGETDEF} <template>]
[, EVENTACTIONS <action>]
[, EXITPARAM '<parameter>']
[, {FETCHCOLS | FETCHCOLSEXCEPT} (<column_list>)]
[, {FETCHMODCOLS | FETCHMODCOLSEXCEPT} (<column_list>)]
[, FETCHBEFOREFILTER]
[, FILTER (<filter_clause>)]
[, GETBEFORECOLS (<column_specification>)]
[, KEYCOLS (<columns>)]
[, SQLEXEC (<SQL_specification>)]
[, SQLPREDICATE 'WHERE <where_clause>']
[, TOKENS (<token_definition>)]
[, TRIMSPACES | NOTRIMSPACES]
[, TRIMVARSPACES | NOTRIMVARSPACES]
[, WHERE (<clause>)]
[, <container>.]<schema.table> PARTITIONOBJID <ptn_object_ID> [, <ptn_object_ID>]
;

MAP 的语法

MAP <source_table>, TARGET <target_table>
[, MOD_COMPARE_COLS( <tgt_col> = <source> )]
[, COLMAP (<column_mapping>)]
[, COMPARECOLS (<column_specification>)]
[, COORDINATED]
[, {DEF | TARGETDEF} <template>]
[, EXCEPTIONSONLY]
[, EXITPARAM '<parameter>']
[, EVENTACTIONS (<action>)]
[, FILTER (<filter_clause>)]
[, HANDLECOLLISIONS | NOHANDLECOLLISIONS]
[, INSERTALLRECORDS]
[, INSERTAPPEND | NOINSERTAPPEND]
[, KEYCOLS (<columns>)]
[, MAPALLCOLUMNS | NOMAPALLCOLUMNS]
[, MAPEXCEPTION (<exceptions_mapping>)]
[, MAPINVISIBLECOLUMNS | NOMAPINVISIBLECOLUMNS]
[, REPERROR (<error>, <response>)]
[, RESOLVECONFLICT (<conflict_resolution_specification>)]
[, SQLEXEC (<SQL_specification>)]
[, THREAD (<thread_ID>)]
[, THREADRANGE (<thread_range>[, <column_list>])]
[, TRIMSPACES | NOTRIMSPACES]
[, TRIMVARSPACES | NOTRIMVARSPACES]
[, WHERE (<clause>)]
[, <container>.]<schema.table> PARTITIONOBJID <ptn_object_ID> [, <ptn_object_ID>]
;

TABLE 和 MAP 选项

下表汇总了可用于 TABLE 和 MAP 参数的选项。请注意,并非所有选项对两个参数都有效。

表 11 TABLE 和 MAP 语法组成部分摘要

组件 说明 有效对象
MAP MOD_COMPARE_COL( tgt_col = source [,...] ) 这是仅复制参数。将指定的源值作为键值分配给目标列之前的图像,该值用于 WHERE 子句。 MAP
TABLE <source_table>[, TARGET <target>] 在用于提取的 TABLE 语句中指定源对象以及到目标对象的可选映射。在提取参数文件中使用。 TABLE
MAP source_table, TARGET target_table 指定复制进程的源目标对象映射。在复制参数文件中使用。 MAP
ATTRCHARSET (charset) 指定 UDT 属性级别的源字符集信息。 TABLE
COLCHARSET character_set 指定任何支持的字符集。 TABLE
COLMAP (column_mapping) 在不同的源列和目标列之间映射记录。 TABLE 和 MAP
{COLS \| COLSEXCEPT} (column_list) 选择或排除要处理的列。 TABLE
COMPARECOLS (column_specification) 指定用于冲突检测和解决的列。 TABLE 和 MAP
COORDINATED 强制将事务处理作为屏障事务处理进行处理。 MAP
{DEF | TARGETDEF} template 指定源定义或目标定义模板。 TABLE 和 MAP
EXCEPTIONSONLY 指定 MAP 语句是例外 MAP 语句。 MAP
EVENTACTIONS (action) 根据满足指定筛选规则的记录触发操作。 TABLE 和 MAP
EXITPARAM 'parameter' 以文字字符串的形式将参数传递到用户出口。 TABLE 和 MAP
FETCHBEFOREFILTER 指示要在执行过滤器之前执行的 FETCHCOLS 或 FETCHCOLSEXCEPT 操作。 TABLE
{FETCHCOLS | FETCHCOLSEXCEPT} (column_list) 允许在值不在事务处理记录中时从源数据库中提取列值。 TABLE
{FETCHMODCOLS | FETCHMODCOLSEXCEPT} (column_list) 强制在事务处理日志中存在列时从数据库中提取列值。 TABLE
FILTER (filter_clause) 根据数值选择记录。FILTER 提供了比 WHERE 更灵活的特性。 TABLE 和 MAP
GETBEFORECOLS (column_specification) 强制捕获列图像并将其写入线索之前。 TABLE
HANDLECOLLISIONS \| NOHANDLECOLLISIONS 将初始加载处理对目标表所做的更改的结果与更改同步组应用的更改结果进行对账。 MAP
INSERTALLRECORDS 将所有行更改应用为插入。 MAP
INSERTAPPEND \| NOINSERTAPPEND 控制复制是否对 INSERT 语句使用 Oracle APPEND 提示。 MAP
KEYCOLS (columns) 指定唯一标识行的列。 TABLE 和 MAP
MAPALLCOLUMNS | NOMAPALLCOLUMNS 控制复制是否获取非键列。 不适用
MAPEXCEPTION (exceptions_mapping) 指定 MAP 语句包含通配符表的异常错误处理。 MAP
MAPINVISIBLECOLUMNS | NOMAPINVISIBLECOLUMNS 控制复制是否在用于默认列映射的 Oracle 目标表中包括不可见列。对于 Oracle 目标表中使用显式列映射的不可见列,这些列始终是映射的,因此不需要此选项。 MAP
REPERROR (error, response) 控制 Replicat 在执行 MAP 语句时如何响应错误。 MAP
RESOLVECONFLICT (conflict_resolution_specification) 指定解决冲突的规则。 MAP
SQLEXEC (SQL_specification) 执行存储过程和查询。 TABLE 和 MAP
SQLPREDICATE 'WHERE where_clause' 允许 WHERE 子句为初始加载选择行。 TABLE
THREAD (thread_ID) 在协调模式下对复制有效。指定指定的复制线程将处理 MAP 语句。 MAP
THREADRANGE (thread_range, column_list) 在协调模式下对复制有效。指定 MAP 语句将由指定的复制线程范围进行处理。 MAP
TOKENS (token_definition) 定义用户令牌。 TABLE
TRIMSPACES \| NOTRIMSPACES 控制在将 CHAR 映射到 VARCHAR 列时是否修剪尾随空格。 TABLE 和 MAP
TRIMVARSPACES \| NOTRIMVARSPACES 控制在将 VARCHAR 映射到 CHAR 或 VARCHAR 列时是否修剪尾随空格。 TABLE 和 MAP
WHERE (clause) 根据条件运算符选择记录。 TABLE 和 MAP
; (Semicolon) 终止 TABLE 或 MAP 语句,并且是必需的。 TABLE 和 MAP
PARTITIONOBJID 可用于集成提取。此选项用于指定要为分区表捕获的分区的对象 ID。 TABLE 和 MAP

MAP MOD_COMPARE_COL( tgt_col = 来源 [,…] )

tgt_col 必须是目标表列名,并且应为关键字列才能正确生效。source 可以是源表列,常数值(数字或字符串),列映射函数或 SQLEXEC 结果。例如,在图像值为 1 之前,source col1 映射到 target col 1. source col1,这是一个虚拟值,因为 DBA 为安全起见屏蔽了它。Replicat 可以通过 SQLEXEC 在映像值 target col1 之前查询实际值。使用 MOD_COMPARE_COLS() 时,Replicat 会将虚拟 source col1 值替换为 SQLEXEC 结果,以便 UPDATE 或 DELETE 操作正常工作。

TABLE <source_table>[, TARGET <target>]

TABLE 在提取参数文件中有效。

使用 TABLE 指定要提取捕获数据的源对象。指定对象的全限定双部分或三部分名称,例如 <schema.table> 或 <catalog.schema.table>。可以使用通配符通过一个 TABLE 语句指定多个对象。要正确指定对象名称和通配符,请参见 Using Wildcards in Database Object Names 和 Using Wildcards in Command Arguments in Oracle GoldenGate Microservices Documentation。

仅当提取必须引用目标定义文件(使用 TARGETDEFS 参数指定)以执行转换或使用 COLMAP 选项映射列时,才使用 TARGET 选项。否则,可以在 TABLE 参数中省略该参数。带有 COLMAP 的列映射和转换工作通常在目标系统上执行,以最大程度地减少复制活动对源系统的影响,但如果需要,可以在源系统上执行。例如,可以在存在多个源和一个目标的配置中的源系统上执行列映射和转换。在此方案中,管理一个目标定义文件(而不是管理每个源数据库的定义文件)可能更容易,尤其是在频繁出现需要生成新定义文件的应用程序更改时。

在 TABLE 参数中使用 TARGET 可根据目标结构(而不是源结构)标识提取数据的元数据,以反映反映在定义文件或列映射中的记录的结构。如果 TARGET 指定了目标 Oracle 容器数据库中的表,则不要使用三部分名称。Replicat 只能连接到一个容器或目录,因此假定名称的容器或目录部分与 Replicat 登录到的容器或目录部分相同(使用 USERIDALIAS 指定,具体取决于数据库)。

如果不需要其他 TABLE 语法选项来处理指定的源数据,则可以使用简单的 TABLE 语句,确保使用分号将其终止。

 TABLE sales.customers;

下面显示了如何使用通配符指定多个表:

 TABLE sales.*;

前面的 TABLE 语句指示 Extract 捕获指定对象的所有受支持列数据并将其写入线索,而无需执行任何过滤、转换或其他操作。

MAP <source_table>, TARGET <target_table>

MAP 在 Replicat 参数文件中有效。还可以使用提取参数文件中的 MAP 更改 Oracle GoldenGate 为表存储的事务处理的名称。请参阅

使用 MAP 指定源对象,使用 TARGET 指定复制源数据应用到的目标对象。MAP 和 TARGET 子句共同组成一个映射。

下面显示了如何使用通配符指定多个表。请注意,TARGET 子句不包括通配符前面的 tab 前缀。该规范将无效,因为通配符将解析为 sales.tabtab1、sales.tabtab2 等。

 MAP sales.tab*, TARGET sales.*;

如果对象不需要进行任何过滤、映射或其他工作,则可以使用如下简单的 MAP 语句,确保每个语句都以分号结束。

MAP sales.customers, TARGET sales.customers;
MAP fin.*, TARGET fin.*;

ATTRCHARSET <(charset)>

ATTRCHARSET 对 TABLE 有效。

使用 ATTRCHARSET 子句指定 UDT 属性级别的源字符集信息。它将覆盖在线索文件中定义的或由 SOURCECHARSET、CHARSET 或 COLCHARSET 参数指定的字符集。

有效值为字符集名称和有效的 UDT 属性名称。支持通配符属性名称。例如:

TABLE SCHEMA.T*,
  ATTRCHARSET(WE8DEC, col*.attr1, col1.attr*.attr3);

COLCHARSET <character_set>

COLCHARSET 对 TABLE 有效。

使用 COLCHARSET 子句指定任何支持的字符集。有关更多信息,请参见 COLCHARSET 。

COLMAP <(column_mapping)>

COLMAP 对 TABLE 和 MAP 有效。

使用 COLMAP 可以:

COLMAP 提供了有关选择、转换和将列数据从源列移动到目标列的说明。注:要在后续 MAP 语句中为所有表的列映射创建全局规则,请使用 COLMATCH 参数。

获取有关配置列映射的更多信息

要使用 COLMAP,必须考虑相关的配置准则,例如源列和目标列结构是相同还是不同,以及全局列映射参数是否足够。

语法

COLMAP (
[USEDEFAULTS, ]
<target_column> = <source_expression> [BINARYINPUT]
[, ...]
)

USEDEFAULTS

如果未在显式列映射中指定源列和目标列,则自动映射名称相同的源列和目标列。数据类型将根据本地数据定义文件根据需要自动转换。如果这些列具有相同的名称并且数据不需要任何筛选或转换,则 USEDEFAULTS 不需要显式列映射。

在 COLMAP 子句中的显式列映射之前指定 USEDEFAULTS。

<target_column = source_expression>

定义显式源 - 目标列映射。

<target_column>

指定目标列的名称。有关列名中支持的字符,请参见 Supported Character Sets 。

<source_expression>

可以是以下任一项:

BINARYINPUT

当目标列定义为二进制数据类型(如 RAW 或 BLOB)时,请使用 BINARYINPUT,但源输入在数据的中间包含二进制零。源输入作为二进制输入进行处理,并禁止替换数据值。

示例 1

MAP ggs.tran, TARGET ggs.tran2, COLMAP (loc2 = loc, type2 = type);

示例 2

TABLE ggs.tran, COLMAP (SECTION = @STRCAT('\u00a7', SECTION ));

{COLS | COLSEXCEPT} (<column_list>)

COLS 和 COLSEXCEPT 对 TABLE 有效。

使用 COLS 和 COLSEXCEPT 控制要捕获数据的列。

要使用 COLS,需要满足以下条件:

如果没有主键、唯一键或 TABLE 语句中的 KEYCOLS 子句,Oracle GoldenGate 将使用表中的所有列,从而使 COLS 不必要。

注意:请勿对数据泵提取组在直通模式下处理的表使用此选项。

语法

{COLS | COLSEXCEPT} (<column> [, ...])

<column>

列的名称。要指定多个 <columns>,请创建一个逗号分隔的列表,例如:

COLS (name, city, state, phone)

注:如果数据库仅记录在更新操作中更改的列的值,则指定使用 COLS 进行捕获的列可能不可用。要使这些列可用,请使用 TABLE 语句中的 FETCHCOLS 选项或为该列启用补充日志记录。

示例

本示例中的 COLS <clause> 仅捕获 <columns> 1 和 3,而 COLSEXCEPT <clause> 捕获除 <columns> 1 和 3 以外的所有 <columns>。

TABLE hq.acct, COLS (col1, col3);
TABLE hq.sales, COLSEXCEPT (col1, col3);

COMPARECOLS (<column_specification>)

COMPARECOLS 对 MAP 有效。

在多主配置中使用 MAP 的 RESOLVECONFLICT 选项进行配置时,使用 COMPARECOLS 指定 Replicat 用于检测和解决更新或删除冲突的列。冲突是线索中记录的先前映像与目标表中的相应数据不匹配。

要使用 COMPARECOLS,必须通过提取 TABLE 语句中的 GETBEFORECOLS 参数在线索记录中提供之前的图像。指定的列必须存在于目标数据库中,并且还必须是 Replicat 配置的一部分(使用或不使用 COLMAP 子句满足 TARGET 规范)。

COMPARECOLS 仅支持标量数据类型作为比较列。标量数据类型可以用在 WHERE 子句中,具有单个原子值,没有内部组件。Oracle GoldenGate 支持的标量数据类型包括以下数据类型,但不是 LOB。

非标量数据类型的一些示例包括空间数据、用户定义的数据类型、大型对象 (LOB)、XML、引用数据类型和 RAW。为 CDR 考虑的行可以包括非标量数据,只要冲突不在非标量数据本身中。

要指定冲突解决例程,请使用 MAP 的 RESOLVECONFLICT 选项。COMPARECOLS 和 RESOLVECONFLICT 可以按 MAP 语句中的任何顺序排列。

获取有关配置 CDR 功能的更多信息

有关配置冲突检测和解决的更多信息,请参见 Automatic Conflict Detection and Resolution 或 Manual Conflict Detection and Resolution 。

语法

COMPARECOLS(
{ON UPDATE | ON DELETE}
{ALL | KEY | KEYINCLUDING (<col>[,...]) | ALLEXCLUDING (<col>[,...]) }
[,...]
)
{ON UPDATE ON DELETE}

指定在更新或删除时是否应比较指定列的之前映像。只能使用 ON UPDATE 和/或 ON DELETE。如果同时使用两者,请在同一 COMPARECOLS 子句中指定它们。有关如何同时使用这两者的示例,请参见示例。

{ALL | KEY | KEYINCLUDING (<col>[,...]) | ALLEXCLUDING (<col>[,...])}

指定捕获之前图像的列。

ALL

使用目标表中的所有列进行比较。如果线索中没有任何图像之前的对应图像可用,则会生成错误。使用 ALL 为 Replicat 施加了最高的处理负载,但允许使用所有列执行冲突检测比较以获得最大准确性。

KEY

仅比较主键列。这是最快的选项,但不允许最准确的冲突检测,因为键可以匹配,但非键列可以不同。

KEYINCLUDING

比较主键列和指定的列。这是速度和检测精度之间的合理折衷。

ALLEXCLUDING

比较除指定列以外的所有列。对于具有多个列的表,ALLEXCLUDING 可能比 KEYINCLUDING 更高效。请勿排除关键字列。

示例 1

在以下示例中,键列加上 name、address 和 salary 列会比较冲突。

MAP src, TARGET tgt
COMPARECOLS (
ON UPDATE KEYINCLUDING (name, address, salary),
ON DELETE KEYINCLUDING (name, address, salary));

示例 2

在以下示例中,将忽略 comment 列,并比较所有其他列是否存在冲突。

MAP src, TARGET tgt
COMPARECOLS (ON UPDATE ALLEXCLUDING (comment))

协调

COORDINATED 对 MAP 有效。当复制处于协调模式时,此选项有效。

使用 COORDINATED 选项强制对同一 MAP 语句中的对象进行的事务作为屏障事务进行处理。它会导致所有 MAP 语句中的所有线程同步到同一线索位置。同步位置是事务处理的开头,该事务处理包含满足包含 COORDINATED 关键字的 MAP 的记录。然后,事务由单个线程以原子方式应用,该线程是当前正在运行的线程中线程 ID 数最低的线程,或者是参数文件中指定了 USEDEDICATEDCOORDINATIONTHREAD 时 ID 为 0 的专用线程。

将忽略与 COORDINATED 一起指定的 THREAD 和 THREADRANGE 子句,因为指定的线程不会应用该记录。COORDINATED 关键字会导致临时挂起并行,以便目标表在应用强制协调事务处理之前处于一致状态。在此之后,并行执行将再次开始。

默认情况下,复制将协调更新主键的事务、执行 DDL 的事务和某些 EVENTACTIONS 操作。COORDINATED 提供了显式协调。

有关详细信息,请参阅关于协调复制。

语法

COORDINATED

示例

下面是使用 COORDINATED 选项的示例。在此示例中,业务规则要求在 Replicat 对 MAP 语句中指定的对象执行包含 SQLEXEC 操作的事务之前,目标表处于一致状态。在这种情况下,并行性必须临时转换为串行 SQL 处理。

Given the following MAP statement, if another thread inserts into t2 a record with a value of 100 for col_val before the insert to t1 is performed by thread 1, then the SQLEXEC will delete the row. 如果其他线程仍在处理值为 100 的记录,则 SQLEXEC 将失败。因此,此 MAP 语句的结果是不可预测的。

MAP u1.t1, TARGET u2.t1 SQLEXEC (ID test2, QUERY ' delete from u2.t2 where col_val =100 ', NOPARAMS)), THREAD(1);

相反,当使用 COORDINATED 时,所有线程都在一个共同点进行同步,包括处理 col_val=100 记录的线程,从而消除结果的不明确性。

MAP u1.t1, TARGET u2.t1 SQLEXEC (ID test2, QUERY ' delete from u2.t2 where col_val =100 ', NOPARAMS)), THREAD(1), COORDINATED;

{DEF| TARGETDEF}<template>

DEF 和 TARGETDEF 对 TABLE 和 MAP 有效。

使用 DEF 和 TARGETDEF 指定由 DEFGEN 实用程序创建的定义模板的名称。

模板基于特定表的定义。它允许将定义与原始表相同的新表添加到 Oracle GoldenGate 配置中,而无需为其运行 DEFGEN,也无需停止和启动 Oracle GoldenGate 进程。模板中的定义用于定义查找。

语法

{DEF | TARGETDEF} <template>

<template>

由 DEFGEN 实用程序生成的以下定义模板之一的名称:

模板中包含的定义必须与在同一 TABLE 或 MAP 语句中指定的表或表的定义相同。

指定模板名称的方式与在数据库中存储的名称相同时,会观察模板名称的大小写敏感性。确保在此 TABLE 或 MAP 语句中的 DEF 或 TARGETDEF 子句以及创建模板的 DEFGEN 参数文件中以相同方式指定模板名称。

示例 1

此示例显示不区分大小写的模板名称。

MAP acct.cust*, TARGET acct.cust*, DEF custdef;

示例 2

此示例显示数据库需要引号来强制区分大小写时的区分大小写的模板名称。

  TABLE acct.cust*, DEF "CustDef";

示例 3

此示例显示了同时使用 DEF 和 TARGETDEF 的情况。

  MAP acct.cust*, TARGET acc.cust*, DEF custdef, TARGETDEF tcustdef;

仅例外

EXCEPTIONSONLY 对 MAP 有效。

在用于错误处理的异常 MAP 语句中使用 EXCEPTIONSONLY。例外 MAP 语句必须位于预计会出现错误的 MAP 语句之后。只有在前面常规 MAP 语句中处理的最后一条记录出现错误时,才会执行异常 MAP 语句。

要使用 EXCEPTIONSONLY,请在常规 MAP 语句或参数文件的根目录中使用带有 EXCEPTION 选项的 REPERROR 语句。有关更多信息,请参见 REPERROR 。注:如果使用 Oracle GoldenGate 冲突检测和解决 (Conflict Detection and Resolution,CDR) 功能,则不需要具有 EXCEPTION 的 REPERROR。CDR 会自动将导致错误的所有操作发送到异常 MAP 语句。

例外 MAP 语句必须指定与常规 MAP 语句相同的源表,但例外 MAP 语句中的目标表必须是例外表。

注:要支持通配符对象名称,请参见 "MAPEXCEPTION (exceptions_mapping) "。

语法

EXCEPTIONSONLY

EVENTACTIONS (<action>)

EVENTACTIONS 对 TABLE 和 MAP 有效。某些选项仅适用于一个参数或另一个参数,并在说明中如此说明。

使用 EVENTACTIONS 可使进程根据线索中的记录(称为事件记录)采取符合特定筛选规则的已定义操作。您可以使用此系统(称为事件标记系统(或事件标记基础结构))基于数据库事件定制处理。例如,可以暂停处理以执行转换或报告统计信息。复制数据更改时支持事件标记功能,但不支持初始加载。

要触发不需要将数据应用于目标表的操作,可以将 Replicat TABLE 参数与支持 EVENTACTIONS 的过滤选项配合使用。有关更多信息,请参见“TABLE for Replicat ”。

您可能需要组合两个或更多操作来实现您的目标。组合多个操作时,将首先对整个 EVENTACTIONS 语句进行语法分析,然后按优先级顺序执行指定的选项。以下列表显示了优先级的顺序。Process the record 之前列出的操作发生在将记录写入到线索或应用于目标之前(取决于该过程)。处理记录后,将执行 Process the record 之后列出的操作。

要防止以正常方式处理事件记录本身,请使用 IGNORE 或 DISCARD 选项。由于 IGNORE 和 DISCARD 在记录本身之前进行求值,因此它们会阻止处理记录。如果没有这些选项,则 EVENTACTIONS for Extract 会将记录写入线索,EVENTACTIONS for Replicat 会将该操作应用于目标数据库。

您应考虑事务处理可能包含两个或多个触发事件操作的记录的可能性。在这种情况下,可能会多次执行某些 EVENTACTIONS 规范。例如,遇到两个触发两个连续 ROLLOVER 操作的合格记录将导致 Extract 翻转该线索两次,从而使两个文件中的一个文件中的事务处理数据为空。

您还应考虑到,当 GETUPDATEBEFORES 参数生效时,会为 UPDATE 操作生成两条记录:一条包含前图像的记录和一条包含后图像的记录。当操作限定为事件记录时,将为这些记录中的每个记录触发事件操作。您可以使用 GGHEADER 列转换函数的 BEFOREAFTERINDICATOR 标记作为 FILTER 子句中的筛选器来限定记录,以便事件操作仅在前一记录或后一记录上触发一次,但不能同时在两者上触发。

以下示例对 BEFORE 指示器进行过滤。遇到 BEFORE 记录时,EVENTACTION 发出 ECHO shell 命令将字符串 'Triggered on BEFORE' 输出到事件日志。

TABLE qasource.test, &
FILTER(@STRFIND('BEFORE', @GETENV('GGHEADER' , 'BEFOREAFTERINDICATOR')) > 0), &
EVENTACTIONS ( shell ('echo --== Triggered on BEFORE ==-- '), LOG);

下面显示了事件 <action> 的结果:

013-03-06 17:59:31  INFO    OGG-05301  Shell command output: '--== Triggered
on AFTER ==--'

以下示例执行相同操作,但对于 AFTER 指示器执行相同操作。

 TABLE qasource.test, &
 FILTER(@STRFIND('AFTER', @GETENV('GGHEADER' , 'BEFOREAFTERINDICATOR')) > 0), &
 EVENTACTIONS ( shell ('echo --== Triggered on AFTER ==-- '), LOG);

语法

EVENTACTIONS (
[STOP | SUSPEND | ABORT | FORCESTOP]
[IGNORE [RECORD | TRANSACTION [INCLUDEVENT]]
[DISCARD]
[LOG [INFO | WARNING]]
[REPORT]
[ROLLOVER]
[SHELL '<command>' | SHELL ('<command>', VAR <variable> = {<column_name> | <expression>}
  [, ...]) ]
[TRACE[2] <file> [TRANSACTION] [DDL[INCLUDE] | DDLONLY] [PURGE | APPEND]]
[CHECKPOINT [BEFORE | AFTER | BOTH]]
[, ...]
)

STOP

在 TABLE 中对提取有效,在 MAP 中对复制有效。

遇到指定的事件记录时,使进程正常停止。该处理将等待事件事务处理中的其他操作在停止之前完成。如果事务处理是按复制分组或分批的事务处理,则会在进程正常停止之前应用当前的一组事务处理。只要该记录还表示事务处理结束,该处理就会在事件记录之后的下一个记录重新启动。

如果由于事务处理仍处于打开状态而无法立即停止,则流程会将消息记录在日志中。但是,如果在长时间运行的未完成事务处理中遇到事件记录,则不会出现警告消息,提醒您事务处理处于未提交状态。因此,尽管发生 STOP 事件,该进程仍可能长时间运行。

STOP 可以与其他 EVENTACTIONS 选项组合使用,但 ABORT 和 FORCESTOP 除外。

SUSPEND

在 TABLE 中对提取有效,在 MAP 中对复制有效。

暂停该进程,使其保留当前运行的活动上下文,并且仍可以响应管理客户机中发出的 SEND 命令。进程暂停时,INFO 命令将其显示为 RUNNING,RBA 字段显示最后一个检查点位置。

要恢复处理,请发出带有 RESUME 选项的 SEND 命令。

要将 CHECKPOINT BEFORE 选项与 SUSPEND 一起使用,事件记录必须是事务的开始,以便 SUSPEND 发生。这样,如果进程在处于暂停状态时被终止,则具有 SUSPEND 操作的事件记录是重新启动时要重新处理的第一个记录。如果同时指定了 CHECKPOINT BERORE 和 SUSPEND,但事件记录不是事务处理的开始,则进程将在发生 SUSPEND 之前异常终止。

要将 CHECKPOINT AFTER 选项与 SUSPEND 结合使用,必须在发生检查点之前发出 RESUME 命令,并且事件记录必须是 COMMIT 记录。如果进程在处于 SUSPEND 状态时终止,则该进程将在重新启动时从上一个检查点位置重新处理事务。

SUSPEND 不能与 ABORT 组合,但可以与所有其他选项组合。

ABORT

在 TABLE 中对提取有效,在 MAP 中对复制有效。

强制在遇到指定的事件记录时立即退出处理,无论是否存在未结事务处理。未处理事件记录。将向日志写入致命错误,如果还指定了 DISCARD,则将事件记录写入丢弃文件。该过程将在启动时进行恢复。

ABORT 只能与 CHECKPOINT BEFORE、DISCARD、SHELL 和 REPORT 组合使用。

FORCESTOP

在 TABLE 中对提取有效,在 MAP 中对复制有效。

强制流程在遇到指定的事件记录时正常停止,但仅当事件记录是事务处理中的最后一个操作或事务处理中的唯一记录时停止。记录以正常方式写入。

如果在长时间运行的未完成事务处理中遇到事件记录,该处理会向日志中写入一条警告消息并立即退出,如 ABORT 中所示。在这种情况下,可能需要在启动时进行恢复。如果在长时间运行的事务处理中触发了 FORCESTOP 操作,则该进程将退出而不发出警告消息。

FORCESTOP 可以与其他 EVENTACTIONS 选项组合使用,ABORT、STOP、CHECKPOINT AFTER 和 CHECKPOINT BOTH 除外。如果与 ROLLOVER 一起使用,则仅当进程正常停止时才会进行滚转。

IGNORE [RECORD TRANSACTION [INCLUDEVENT]]

在 TABLE 中对提取有效,在 MAP 中对复制有效。

根据所选操作,忽略部分或全部事务处理。

IGNORE 可以与除 ABORT 和 DISCARD 以外的所有其他 EVENTACTIONS 选项组合使用。

处理所有限定、过滤、映射和用户退出操作后,将处理 IGNORE 操作。在最终输出阶段将忽略该记录或事务处理,并防止将记录或事务处理写入输出目标(在提取时为线索,在复制时为数据库)。因此,在某些表达式(例如包含 SQLEXEC 操作的表达式)中,SQLEXEC 将在处理 IGNORE 之前执行。这意味着,虽然记录未写入线索或目标数据库,但将发生通过资格、筛选、映射和用户退出处理记录的所有影响。

此操作对 DDL 记录无效。由于 DDL 操作是自治的,因此忽略记录等同于忽略整个事务处理。

DISCARD

在 TABLE 中对提取有效,在 MAP 中对复制有效。

使进程执行以下操作:

该处理将使用线索中的下一个记录恢复处理。

DISCARD 可以与除 IGNORE 以外的所有其他 EVENTACTIONS 选项组合使用。

LOG [INFO WARNING]

在 TABLE 中对提取有效,在 MAP 中对复制有效。

导致进程在遇到指定的事件记录时记录事件。该消息将写入报告文件、Oracle GoldenGate 错误日志和系统事件日志。

使用以下选项指定消息的严重性:

LOG 可以与除 ABORT 以外的所有其他 EVENTACTIONS 选项组合使用。如果使用 ABORT,则不需要 LOG,因为 ABORT 在进程退出之前记录了致命错误。

REPORT

在 TABLE 中对提取有效,在 MAP 中对复制有效。

导致处理在遇到指定的事件记录时生成报告文件。这与在 GGSCI 中使用带有 REPORT 选项的 SEND 命令相同。

在处理事件记录之后(除非使用 DISCARD、IGNORE 或 ABORT),将出现 REPORT 消息,因此报告数据将包括事件记录。

REPORT 可以与所有其他 EVENTACTIONS 选项组合使用。

ROLLOVER

在 TABLE 中对提取有效。

导致“提取”在遇到指定的事件记录时将线索结转到新文件。ROLLOVER 操作在 Extract 将事件记录写入线索文件之前发生,这将导致该记录成为新文件中的第一个记录,除非同时使用 DISCARD、IGNORE 或 ABORT。

ROLLOVER 可以与除 ABORT 以外的所有其他 EVENTACTIONS 选项组合使用。ROLLOVER 不能与 ABORT 组合,因为 ROLLOVER 不会导致进程写入检查点,ROLLOVER 在 ABORT 之前发生。

如果没有 ROLLOVER 检查点,ABORT 将导致 Extract 在重新启动时转到其上一个检查点,该检查点将位于上一个线索文件中。实际上,这将取消滚存。

SHELL '<command>'

在 TABLE 中对提取有效,在 MAP 中对复制有效。

导致进程在遇到事件记录时执行指定的 shell 命令。SHELL '<command'> 执行基本 shell 命令。命令字符串采用其文字值,并以这种方式发送到系统。该命令区分大小写。将命令字符串括在单引号内,例如:

 EVENTACTIONS (SHELL 'echo hello world! > output.txt')

如果 shell 命令成功,进程会将信息性消息写入到报告文件和事件日志中。成功基于命令的退出状态(符合 UNIX shell 语言)。在这种语言中,零表示成功。

如果系统调用不成功,则进程将异常终止,并出现致命错误。在 UNIX shell 语言中,非零等于失败。请注意,该错误消息仅与 SHELL 命令本身的执行相关,而不与任何从属命令的退出状态相关。例如,SHELL 可以成功执行脚本,但该脚本中的命令可能会失败。

SHELL 可以与所有其他 EVENTACTIONS 选项组合使用。

SHELL ('<command>', VAR <variable> = {<column_name> | <expression>} [, ...])

在 TABLE 中对提取有效,在 MAP 中对复制有效。

导致进程在遇到事件记录时执行指定的 shell 命令并支持参数传递。该命令和参数区分大小写。

当 SHELL 与参数一起使用时,整个 <command> 和参数字符串必须括在括号内,例如:

 EVENTACTIONS (SHELL
 ('Current timestamp: $1  SQLEXEC result is $2 ',VAR $1 = @GETENV('JULIANTIMESTAMP'),
 VAR $2 = mytest.description));

输入如下所示:

<command>

是命令,该命令按字面意义传递到系统。

VAR

是启动参数输入的必需关键字。

<variable>

占位符变量的用户定义名称,将在其中替换运行时变量值。命令中未使用的额外变量将被忽略。请注意,SHELL 命令中与 VAR 变量名称匹配的任何文字都将替换为替换的 VAR 值。这可能会产生意想不到的后果,因此请在将代码投入生产之前对其进行测试。

<column_name>

可以是列值的前或后(当前)图像。

<expression>

可以是以下项,具体取决于是处理列数据还是处理 DDL。

<TRACE[2]file> [TRANSACTION] [DDL[INCLUDE] | DDLONLY] [PURGE | APPEND]

在 TABLE 中对提取有效,在 MAP 中对复制有效。

导致在遇到指定的事件记录时将进程跟踪信息写入跟踪文件。TRACE 提供分步处理信息。TRACE2 标识进程花费最多时间的代码段。

默认情况下(不带选项),在进程终止之前,将启用不带事务处理边界准则的标准 DML 跟踪。

TRACE 可以与除 ABORT 以外的所有其他 EVENTACTIONS 选项组合使用。

要禁用对指定跟踪文件的跟踪,请发出带有 TRACE OFF <file_name> 选项的 GGSCI SEND processcommand。

CHECKPOINT [BEFORE AFTER BOTH]

在 TABLE 中对提取有效,在 MAP 中对复制有效。

导致进程在遇到指定的事件记录时写入检查点。检查点操作围绕 TABLE 或 MAP 语句中定义的处理提供上下文。此上下文具有起点和终点,因此提供了用于映射使用 SQLEXEC 和用户出口执行的函数的同步点。

BEFORE

提取处理的 BEFORE 在提取将事件记录写入到线索之前将检查点写入。在 Replicat 将记录中包含的 SQL 操作应用于目标之前,复制进程的 BEFORE 会写入检查点。

BEFORE 要求事件记录是事务处理中的第一条记录。如果不是第一个记录,该过程将异常终止。使用 BEFORE 可确保提交以事件记录开头的事务处理之前的所有事务处理。

将 EVENTACTIONS 用于 DDL 记录时,请注意,由于每个 DDL 记录都是自治的,因此保证 DDL 记录是事务处理的开始;因此,对 DDL 记录隐含 CHECKPOINT BEFORE 事件操作。

CHECKPOINT BEFORE 可以与所有 EVENTACTIONS 选项组合使用。

AFTER

在 Extract 将事件记录写入到线索后,对于 Extract 的 AFTER 将写入检查点。Replicat 的 AFTER 在 Replicat 将记录中包含的 SQL 操作应用于目标后写入检查点。

AFTER 将检查点请求标记为指导,这意味着该进程只会在下一个实际机会发出检查点。例如,如果事件记录是多记录事务处理之一,则检查点将按照 Oracle GoldenGate 数据完整性模型在下一个事务处理边界进行。

将 EVENTACTIONS 用于 DDL 记录时,请注意,由于每个 DDL 记录都是自治的,因此保证 DDL 记录是事务处理的结束(边界);因此,对 DDL 记录隐含 CHECKPOINT AFTER 事件操作。

CHECKPOINT AFTER 可以与除 ABORT. 以外的所有 EVENTACTIONS 选项组合使用

BOTH

BOTH 将 BEFORE 和 AFTER 组合在一起。提取或复制处理在处理事件记录之前和之后写入检查点。

CHECKPOINT BOTH 可以与除 ABORT. 以外的所有 EVENTACTIONS 选项组合使用

CHECKPOINT 可以缩短为 CP。

示例 1

以下示例说明如何将进程配置为忽略某些记录。提取处理具有 name = abc 的任何线索记录时,将忽略该记录。

TABLE fin.cust, &
WHERE (name = 'abc'), &
EVENTACTIONS (ignore);

示例 2

根据 EVENTACTIONS 选项的兼容性和优先级规则,DISCARD 的优先级高于 ABORT,因此在本例中,事件记录会在进程异常终止之前写入放弃文件。

MAP fin.cust, TARGET fin.cust2, &
WHERE (name = 'abc'), &
EVENTACTIONS (DISCARD, ABORT);

示例 3

以下示例执行 SHELL 操作。它将获取 SQLEXEC 查询的结果并将其与当前时间戳配对。

TABLE src.tab &
SQLEXEC (id mytest, query 'select description from lookup &
where pop = :mycol2', params (mycol2 = col2) ), &
EVENTACTIONS (SHELL ('Current timestamp: $1  SQLEXEC result is $2 ', &
VAR $1 = @GETENV('JULIANTIMESTAMP'), VAR $2 = mytest.description));

此示例产生的 shell <command> 可能类似于以下内容:

'Current timestamp: 212156002704718000  SQLEXEC result is test passed'

示例 4

以下示例说明如果占位符名称与命令字符串中的文字文本冲突,将如何产生无效结果。在此示例中,名为 $1 的占位符与列值关联,SHELL 命令回显包含 $1 的文字字符串。

MAP src.tab1, TARGET targ.tab1 &
EVENTACTIONS (SHELL ('echo Extra charge for $1 is $1', VAR $1 = COL1));

这是意外结果,假设 <column> 值为 gift wrap:

'Extra charge for gift wrap is gift wrap'

将占位符 <variable> 更改为 $col 将生成正确的输出:

MAP src.tab1, TARGET targ.tab1 &
EVENTACTIONS (SHELL ('echo Extra charge for $col is $1', VAR $col = COL1));
'Extra charge for gift wrap is $1'

下面显示了相似的潜在意外结果:

MAP src.tab1, TARGET targ.tab1 &
EVENTACTIONS (SHELL ('Timestamp: $1  Price is $13 > out.txt ', &
VAR $1 = @GETENV('JULIANTIMESTAMP')));

重定向的输出 <file> 可能包含这样的 <string>(请注意,第二个时间戳包含附加值 3):

'Timestamp: 212156002704718000 Price is 2121560027047180003'

预期结果如下:

'Timestamp: 212156002704718000 Price is $13'

示例 5

这些示例显示了配置跟踪的不同方法。

MAP tab1, TARGET tab1 EVENTACTIONS (TRACE ./dirrpt/trace
1.txt);
MAP tab2, TARGET tab2 EVENTACTIONS (TRACE ./dirrpt/trace2.txt TRANSACTION);

示例 6

下面显示了如何使用带有 SUSPEND 的 EVENTACTIONS。

EXITPARAM '<parameter>'

EXITPARAM 对 TABLE 和 MAP 有效。

每当遇到来自 TABLE 或 MAP 语句的记录时,使用 EXITPARAM 将参数传递给用户出口例程的 EXIT_PARAMS 函数。

语法

EXITPARAM '<parameter string>'

<'parameter string'>

是一个文字字符串的参数。将参数括在单引号中。最多可以为参数字符串指定 100 个字符。

提取前筛选器

FETCHBEFOREFILTER 对 TABLE 有效。

在执行 FILTER 操作之前,使用 FETCHBEFOREFILTER 提取通过 FETCHCOLS 或 FETCHCOLSEXCEPT 指定的列。在筛选器之前提取可确保筛选器所需的值可用。如果没有 FETCHBEFOREFILTER,则在执行过滤器之后才会执行使用 FETCHCOLS 或 FETCHCOLSEXCEPT 指定的提取。在参数文件中将 FETCHBEFOREFILTER 指定在 FILTER 之前。

对于数据泵提取组在直通模式下正在处理的表,请勿使用此选项。

语法

FETCHBEFOREFILTER

示例

TABLE hr.salary, FETCHCOLS (<sal_level>),
FETCHBEFOREFILTER,
FILTER (sal_level >= 8)
;

{FETCHCOLS | FETCHCOLSEXCEPT} (<column_list>)

FETCHCOLS 和 FETCHCOLSEXCEPT 对 TABLE 有效。这些选项仅对主要提取有效。

当事务处理日志记录中不存在列值时,使用 FETCHCOLS 和 FETCHCOLSEXCEPT 从数据库中提取列值。如果数据库仅记录在更新操作中更改的列的值,但需要确保 FILTER 操作所需的其他列值可用,则使用此选项。

FETCHCOLS 和 FETCHCOLSEXCEPT 对 Oracle GoldenGate 支持的所有数据库有效。

对于 Oracle AI Database,Oracle GoldenGate 通过 Oracle 的闪回查询机制从还原表空间中提取值。该查询提供截至特定时间或 SCN 的列的一致读取映像。有关 Oracle GoldenGate 如何使用闪回查询的详细信息。

不使用 FETCHCOLS 或 FETCHCOLSEXCEPT,为所需的列启用补充日志记录可能更有效。

要在无法找到指定用于提取的列时控制提取并启用响应,请使用 FETCHOPTIONS 参数。要将提取结果包括在由 STATS EXTRACT 命令生成的统计显示中,请使用 STATOPTIONS 参数。

如果事务处理日志中存在使用 FETCHCOLS 或 FETCHCOLSEXCEPT 指定的列的值,则不会执行数据库提取。这样可以减少数据库开销。

语法

{FETCHCOLS | FETCHCOLSEXCEPT} (<column> [, ...])

<column>

可以是以下名称之一:

示例

本示例中的 FETCHCOLS 子句仅提取列 1 和 3,而 FETCHCOLSEXCEPT 子句提取列 1 和 3 除外的所有列。

TABLE hq.acct, FETCHCOLS (col1, col3);
TABLE hq.sales, FETCHCOLSEXCEPT (col1, col3);

{FETCHMODCOLS | FETCHMODCOLSEXCEPT} (<column_list>)

FETCHMODCOLS 和 FETCHMODCOLSEXCEPT 对 TABLE 有效。这些选项仅对主要提取有效。

使用 FETCHMODCOLS 和 FETCHMODCOLSEXCEPT 可以强制从数据库中提取列值,即使事务处理日志中存在这些列也是如此。这些列取决于数据库类型,日志记录可以包含表的所有列,也可以仅包含给定事务处理操作中更改的列。

FETCHMODCOLS 和 FETCHMODCOLSEXCEPT 对 Oracle GoldenGate 支持的所有数据库有效。

遵循以下使用准则:

语法

{FETCHMODCOLS | FETCHMODCOLSEXCEPT} (<column> [, ...])

(<column> [, ...])

可以是以下名称之一:

示例

本示例中的 FETCHMODCOLS 子句仅提取列 1 和 3,而 FETCHMODCOLSEXCEPT 子句提取列 1 和 3 除外的所有列。

TABLE hq.acct, FETCHMODCOLS (col1, col3);
TABLE hq.sales, FETCHMODCOLSEXCEPT (col1, col3);

FILTER (<filter_clause>)

FILTER 对 TABLE 和 MAP 有效。

使用 FILTER 可根据数值选择或排除记录。筛选器表达式可以使用条件运算符和/或 Oracle GoldenGate 列转换函数。注:要基于字符串进行筛选,请使用 Oracle GoldenGate 字符串函数之一。有关这些函数的详细信息,请参阅表和列映射函数。还可以使用 WHERE 选项。请参见“WHERE(条款)”。

使用逗号分隔所有 FILTER 组件。FILTER 子句可以包括以下各项:

用单引号将文字引起来。指定存储在数据库中的区分大小写的列名,如果数据库需要引号来强制区分大小写(例如 Oracle),则用双引号将它们括起来。

Oracle GoldenGate 支持对具有多字节字符集的列使用 FILTER。

语法

FILTER (
[, ON INSERT | ON UPDATE| ON DELETE]
[, IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE]
, <filter_clause>
[, RAISEERROR <error_number>]
)

<filter_clause>

根据 <expression> 选择记录,例如:

FILTER ((PRODUCT_PRICE*PRODUCT_AMOUNT) > 10000))

可以在过滤器 <clause> 中使用 Oracle GoldenGate 的列转换函数,如下所示:

FILTER (@COMPUTE (PRODUCT_PRICE*PRODUCT_AMOUNT)>10000)

用单引号将文字引起来。指定存储在数据库中的区分大小写的列名,如果数据库需要引号来强制区分大小写(例如 Oracle),则用双引号将它们括起来。

对于具有多字节字符集或与本地操作系统的字符集不兼容的字符集的列,Oracle GoldenGate 不支持 FILTER。

过滤器子句的最大大小为 5,000 字节。

ON INSERT ON UPDATE ON DELETE

将记录筛选限制为指定的操作。使用逗号分隔操作,例如:

FILTER (ON UPDATE, ON DELETE,
@COMPUTE (PRODUCT_PRICE*PRODUCT_AMOUNT)>10000)

上面的示例执行 UPDATE 和 DELETE 操作的过滤器,但不执行 INSERT 操作。

IGNORE INSERT IGNORE UPDATE IGNORE DELETE

不对指定的操作应用过滤器。使用逗号分隔操作,例如:

FILTER (IGNORE INSERT, @COMPUTE (PRODUCT_PRICE*PRODUCT_AMOUNT)>10000)

上面的示例对 UPDATE 和 DELETE 操作执行过滤器,但忽略 INSERT 操作。

RAISEERROR <error>

如果筛选器失败,则引发用户定义的错误编号。可用作 REPERROR 参数的输入以调用错误处理。确保 <error> 的值超出数据库或 Oracle GoldenGate 使用的错误号范围。例如:RAISEERROR 21000。

GETBEFORECOLS (<column_specification>)

GETBEFORECOLS 对 TABLE 有效。

使用 GETBEFORECOLS 指定要在更新或删除操作时捕获图像并将其写入线索之前的列。在双向或多主配置中使用 Oracle GoldenGate 冲突检测和解决 (Conflict Detection and Resolution,CDR) 功能时,请使用 GETBEFORECOLS。在使用转换函数或其他需要记录之前映像的处理功能时也使用它。

对于更新,无论是否修改任何给定列,都会在线索中包括指定列的之前映像。除了 GETBEFORECOLS 子句中指定的列之外,Oracle AI Database 还将记录其他已修改列的之前的映像。对于其他受支持的数据库,可以使用 GETUPDATEBEFORES 参数强制包含已修改的其他列的之前值。

注意:如果 GETUPDATEBEFORES 覆盖 GETBEFORECOLS(如果两者都用在同一参数文件中)。

要使用此参数,必须为默认情况下在值之前未记录的任何数据库启用补充日志记录。

如果 GETBEFORECOLS 用于同一参数文件,则将覆盖 COMPRESSUPDATES 和 COMPRESSDELETES。

此参数对除 Db2 z/OS 以外的所有数据库都有效。对于 Oracle GoldenGate 支持的所有平台上的 Db2 z/OS,请使用 GETUPDATEBEFORES 参数而不是 GETBEFORECOLS.

语法

GETBEFORECOLS(
{ON UPDATE | ON DELETE}
{ALL | KEY | KEYINCLUDING (<col>[,...])  | KEYANDMOD | | ALLEXCLUDING (<col>[,...]) }
[,...]
)
{ON UPDATE ON DELETE}

指定是否应捕获指定列的之前映像以进行更新或删除。只能使用 ON UPDATE 和/或 ON DELETE。如果同时使用两者,请在同一 GETBEFORECOLS 子句中指定它们。有关如何同时使用这两者的示例,请参见示例。

{ALL | KEY | KEYINCLUDING (<col>[,...]) | KEYANDMOD | ALLEXCLUDING (<col>[,...])}

指定捕获之前图像的列。

ALL

捕获目标表中所有受支持的数据类型列(包括主键)的先前映像;将跳过所有不受支持的列并将其作为信息消息记录在提取或复制参数文件中。这对提取施加了最高的处理负载,但允许使用所有列执行冲突检测比较以获得最大准确性。

KEY

仅针对主键在图像之前捕获。这是最快的选项,但不允许最准确的冲突检测,因为键可以匹配,但非键列可以不同。KEY 是缺省值。

KEYINCLUDING

在主键和指定列图像之前捕获。这是速度和检测精度之间的合理折衷。

KEYANDMOD

使用此选项作为提取和复制关键字选项的扩展。要更新源上的 DML,提取将记录密钥和修改的列。目标上的复制将在 WHERE 子句中的冲突检测期间使用 KEY 和 MODIFIED 列。对于 Oracle AI 数据库,默认情况下,修改后的列始终用于冲突检测,此参数使其显式。

ALLEXCLUDING

先捕获除指定列以外的所有列的图像。对于具有多个列的表,ALLEXCLUDING 可能比 KEYINCLUDING 更高效。请勿排除关键字列。

示例

在以下示例中,在更新和删除操作时,键列加上 name、address 和 salary 的前面映像始终写入到线索文件中。

TABLE src,
GETBEFORECOLS (
ON UPDATE KEYINCLUDING (name, address,  salary),
ON DELETE KEYINCLUDING (name, address, salary));

HANDLECOLLISIONS | NOHANDLECOLLISIONS

HANDLECOLLISIONS 和 NOHANDLECOLLISIONS 对 MAP 有效。

使用 HANDLECOLLISIONS 和 NOHANDLECOLLISIONS 控制 Oracle GoldenGate 是否将初始加载的结果与对相同表所做的复制事务处理更改进行对账。在加载完成后,Oracle GoldenGate 应用复制的更改时,HANDLECOLLISIONS 会导致复制覆盖目标表中的重复记录,并为缺少的记录提供替代的错误处理。

HANDLECOLLISIONS 和 NOHANDLECOLLISIONS 可以全局用于参数文件中的所有 MAP 语句,也可以作为 ON/OFF 开关用于使用 MAP 语句指定的表组,并且可以在 MAP 语句中使用。在 MAP 语句中使用时,它们将覆盖全局规范。

有关语法和用法,请参见 "HANDLECOLLISIONS | NOHANDLECOLLISIONS "。

插入所有记录

INSERTALLRECORDS 对 MAP 有效。

使用 INSERTALLRECORDS 参数可将目标上的所有映射操作转换为 INSERT 操作。INSERTALLRECORDS 可在参数文件的根级别、MAP 语句中以及 MAP 语句的 MAPEXCEPTION 子句中使用。

有关语法和用法,请参见 "INSERTALLRECORDS "。

插入附加 | 无插入附加

INSERTAPPEND 对 MAP 有效。

使用 INSERTAPPEND 和 NOINSERTAPPEND 参数控制 Replicat 在将 INSERT 操作应用于 Oracle 目标表时是否使用 APPEND 提示。这些参数仅对 Oracle 数据库有效。

有关语法和用法,请参见 "INSERTAPPEND | NOINSERTAPPEND "。

KEYCOLS (<columns>)

KEYCOLS 对 TABLE 和 MAP 有效。

使用 KEYCOLS 将目标表的一个或多个列定义为唯一列。KEYCOLS 的主要用途是在主键或相应的唯一索引不可用于表时定义替代主键。还可以使用 KEYCOLS 指定要在 Replicat 使用的行标识符中使用的其他列。如果没有键或 KEYCOLS 子句的可用性,Replicat 将使用表的所有列来构建其 WHERE 子句,实质上执行全表扫描。

由 KEYCOLS 呈现的键的列必须唯一标识行,并且它们必须与用作源表中的键的列匹配。源表的键或索引列必须至少与为目标表指定的 KEYCOLS 键相同。否则,在更新源键或索引列时,复制将不具有额外目标 KEYCOL 列的之前映像。

使用 KEYCOLS 定义替代密钥时,请遵循以下准则:

使用 KEYCOLS 时,确保为日志记录配置了指定的列,以便这些列可用于线索记录中的复制。对于 Oracle AI 数据库,可以使用 ADD TRANDATA 命令的 COLS 选项启用日志记录。

在目标表上,在 KEYCOLS 定义的键列上创建一个唯一索引。索引可提高 Oracle GoldenGate 定位需要处理的目标行的速度。

请勿对数据泵提取组在直通模式下处理的表使用 KEYCOLS。

使用并行复制或集成复制时 KEYCOLS 的其他准则:

语法

KEYCOLS (<column> [, ... ])

<column>

定义要用作替代主关键字的列。如果存在主键或唯一键,则这些列必须包括在 KEYCOLS 规范中。要指定多个列,请创建逗号分隔的列表,如下所示:

KEYCOLS (id, name)

KEYCOLS 中不支持以下列类型:

示例

KEYCOLS

MAPEXCEPTION (<exceptions_mapping>)

MAPEXCEPTIONS 对 MAP 有效。

将 MAPEXCEPTION 用作用于错误处理的异常 MAP 语句的一部分。MAPEXCEPTION 将 REPERROR 参数标记为异常的失败操作映射到异常表。Replicat 将这些操作的值以及其他信息写入异常表中。

可以在包含源 - 目标表映射和其他标准 MAP 选项的同一 MAP 语句中使用 MAPEXCEPTION。源表名和目标表名可以包含通配符。

使用 MAPEXCEPTION 时,在同一 MAP 语句中或在 Replicat 参数文件的根目录中使用带有 EXCEPTION 选项的 REPERROR 语句。请参见 "EXCEPTIONSONLY " 和 "REPERROR "。

语法

MAPEXCEPTION (TARGET <exceptions_table>, INSERTALLRECORDS [, <exception_MAP_options>])

TARGET <exceptions_table>

异常错误表的全限定名称。对象名称的标准 Oracle GoldenGate 规则应用于异常表的名称。

<exception_MAP_options>

要应用于异常处理的 MAP 参数的任何有效选项。

INSERTALLRECORDS

将所有异常作为 INSERT 操作应用于异常表。使用 MAPEXCEPTION 时需要此参数。

示例

这是如何使用 MAPEXCEPTION 进行异常映射的示例。MAP 和 TARGET 子句包含通配符源表名和目标表名。使用指定的映射将处理名称以 TRX 开头的任何表时发生的异常错误捕获到 fin.trxexceptions 表。

MAP src.trx*, TARGET trg.*,
MAPEXCEPTION (TARGET fin.trxexceptions,
INSERTALLRECORDS,
COLMAP (USEDEFAULTS,
ACCT_NO = ACCT_NO,
OPTYPE = @GETENV ('LASTERR', 'OPTYPE'),
DBERR = @GETENV ('LASTERR', 'DBERRNUM'),
DBERRMSG = @GETENV ('LASTERR', 'DBERRMSG')
)
);

MAPALLCOLUMNS | NOMAPALLCOLUMNS

MAPALLCOLUMNS 和 NOMAPALLCOLUMNS 对 MAP 有效。

使用 MAPALLCOLUMNS 获取未映射的列(非键)。指定此选项时,“提取”或“复制”将检查是否将所有源列直接映射到目标,而不使用列映射功能。如果未映射任何源列,则提取和/或复制将异常终止。

请参见“MAPALLCOLUMNS| NOMAPALLCOLUMNS ”。

MAPINVISIBLE 列 | NOMAPINVISIBLE 列

MAPINVISIBLECOLUMNS 和 NOMAPINVISIBLECOLUMNS 对 MAP 有效。

使用 MAPINVISIBLECOLUMNS 和 NOMAPINVISIBLECOLUMNS 控制复制是否在 Oracle 目标表中包括不可见的列以进行默认列映射。对于使用显式列映射的 Oracle 目标表中的不可见列,它们始终是映射的,因此不需要此选项。

可使用两种不同的方式使用 MAPINVISIBLECOLUMNS 和 NOMAPINVISIBLECOLUMNS。在全局级别指定时,一个参数对所有后续的 MAP 语句保持有效,直到指定另一个参数。在 MAP 语句中使用时,它们将覆盖全局规范

有关语法和用法,请参见 "MAPINVISIBLECOLUMNS | NOMAPINVISIBLECOLUMNS "。

REPERROR (<error>,<response>)

REPERROR 对 MAP 有效。

使用 REPERROR 指定错误和响应,这些错误和响应共同控制 Replicat 在执行 MAP 语句时如何响应错误。可以在 MAP 级别使用 REPERROR 来覆盖和补充在参数文件的根级别使用 REPERROR 参数设置的全局错误处理规则。可以对同一 MAP 语句应用多个 REPERROR 语句,以自动、全面地管理错误和无中断复制处理。

有关语法和说明,请参见“REPERROR ”。

RESOLVECONFLICT (<conflict_resolution_specification>)

RESOLVECONFLICT 对 MAP 有效。

在双向或多主配置中使用 RESOLVECONFLICT 可指定 Replicat 如何处理对 MAP 语句中的表执行的操作冲突。

可以为同一冲突类型指定多个解决方法,并按 RESOLVECONFLICT 中列出的顺序执行。多个解析仅限于 INSERTROWEXISTS 和 UPDATEROWEXISTS 冲突。

RESOLVECONFLICT 可以在 MAP 语句中多次使用,以便为不同的冲突类型指定不同的解决方法。

以下是 RESOLVECONFLICT 支持的数据类型和平台。

语法

RESOLVECONFLICT (
{INSERTROWEXISTS | UPDATEROWEXISTS | UPDATEROWMISSING |
   DELETEROWEXISTS | DELETEROWMISSING}
( {DEFAULT | <resolution_name>},
  {USEMAX (<resolution_column>) | USEMAXEQ (<resolution_column>) | USEMIN (<resolution_column>) | USEMINEQ (<resolution_column>) | USEDELTA |
     DISCARD | OVERWRITE | IGNORE}
 )
[, COLS (<column>[,...])]
)
INSERTROWEXISTS UPDATEROWEXISTS UPDATEROWMISSING
DELETEROWEXISTS DELETEROWMISSING  

此解决方法处理的冲突类型。

INSERTROWEXISTS

插入的行违反了目标上的唯一性约束条件。

UPDATEROWEXISTS

目标上存在更新的行,但线索中的一个或多个列具有与数据库中的当前值不同的前图像。

UPDATEROWMISSING

目标中不存在更新的行。

DELETEROWEXISTS

目标中存在已删除的行,但线索中的一个或多个列具有与数据库中的当前值不同的前置图像。

DELETEROWMISSING

目标中不存在已删除的行。

DEFAULT | <resolution_name>

DEFAULT

默认列组。与 DEFAULT 列组关联的解析将用于未显式命名的列组中的所有列。必须定义 DEFAULT 列组。

<resolution_name>

链接到特定解析类型的特定列组的名称。提供用于标识解决类型的名称。有效值是字母数字字符。避免使用空格和特殊字符,但允许使用下划线,例如:

delta_res_method

使用指定的分辨率或 DEFAULT,但不能同时使用两者。

USEMAX (<resolution_column>) | USEMAXEQ (<resolution_column>) | USEMIN (<resolution_column>) | USEMINEQ (<resolution_column>) | USEDELTA |    
DISCARD OVERWRITE IGNORE

用于解决冲突的冲突处理程序逻辑。有效分辨率包括:

USEMAX

如果线索记录中的 <resolution_column> 值大于数据库中的列值,则执行相应的操作。

USEMAXEQ

如果线索记录中的 <resolution_column> 值大于或等于数据库中的列值,将执行相应的操作。

USEMIN

如果线索记录中的 <resolution_column> 值小于数据库中的 <column> 值,将执行相应的 <action>:

USEMINEQ

如果线索记录中的 <resolution_column> 值小于或等于数据库中的 <column> 值,将执行相应的 <action>:

<resolution_column>

充当解析列的 NOT NULL 列的名称。此列必须是与此解析关联的列组的一部分。解析列的值与目标数据库中的当前值进行比较,确定应如何应用解析。分辨率列的后图像用于比较(如果可用);否则使用前图像值。使用可通过简单 SQL 进行比较的列:

要使用最新时间戳分辨率,请使用时间戳列作为 <resolution_column>,并将时间戳列设置为插入或更新行的当前时间。如果可能,请使用支持小数秒的 SYSTIMESTAMP 数据类型定义分辨率列。当使用亚秒粒度执行比较时,几乎不需要进行冲突处理程序,以解决在线索和目标中解析列的值相同的情况。如果确保时间戳列的值只能增加或仅减少(取决于分辨率),则 USEMAX 和 USEMIN 不会导致数据差异。

注意:

不要使用主键列作为 USEMAX 语句中解决 UPDATEROWEXISTS 冲突的解决列。否则,复制会异常终止,并出现类似于以下内容的错误:

  2013-04-04 10:18:38 ERROR OGG-01922 Missing RESOLUTION COLUMN NAME while mapping to target table "FIN"."ACCT".

USEDELTA

(仅限 UPDATEROWEXISTS 冲突)将线索记录中的前后值之间的差异添加到目标数据库中列的当前值。如果任一值为 NULL,则会引发错误。基于包含 NUMERIC 数据类型的列 USEDELTA。当行在多个节点上同时更新时,USEDELTA 在多节点配置中非常有用。它仅将列值中的差异传播到其他节点,以便所有节点都同步。

DISCARD

(对所有冲突类型有效)在目标数据库中保留当前值,并将线索记录中的数据写入放弃文件。

请谨慎使用 DISCARD,因为它可能会导致数据差异。

OVERWRITE

(对于除 DELETEROWMISSING 以外的所有冲突类型有效)按如下方式应用线索记录:

请谨慎使用 OVERWRITE,因为它可能会导致数据差异。

IGNORE

(对所有冲突类型有效)保留目标数据库中的当前值,并忽略线索记录:不适用于目标表或放弃文件。

COLS (<column>[, ...])

非默认列组。这是目标数据库(映射后)中链接到特定解析类型并由其进行操作的列的列表。如果没有为冲突指定列组,则所有列都受为给定冲突指定的解决方法的影响。

或者,可以指定 DEFAULT 列组,该组包括其他列组中未列出的所有列。请参见 DEFAULT 选项。

可以指定多个列组,每个列组具有不同的分辨率。例如,可以将 OVERWRITE 用于 col2 和 col3,而将 USEDELTA 用于 col4。任何组中的任何列都不能位于任何其他组中。不同列组中各列的冲突将根据指定的分辨率和列出的顺序单独解决。

列组的工作方式如下:

示例

示例 1

本示例演示了 USEMAX、OVERWRITE 和 DISCARD 的所有冲突类型。

MAP fin.src, TARGET fin.tgt,
    COMPARECOLS (ON UPDATE ALL, ON DELETE ALL),
    RESOLVECONFLICT (UPDATEROWEXISTS, (DEFAULT, USEMAX (last_mod_time)),
    RESOLVECONFLICT (INSERTROWEXISTS, (DEFAULT, USEMAX (last_mod_time)),
    RESOLVECONFLICT (DELETEROWEXISTS, (DEFAULT, OVERWRITE)),
    RESOLVECONFLICT (UPDATEROWMISSING, (DEFAULT, OVERWRITE)),
    RESOLVECONFLICT (DELETEROWMISSING, (DEFAULT, DISCARD)),
    );

示例 2

本示例演示了 UPDATEROWEXISTS 以及 USEDELTA 和 USEMAX。

MAP fin.src, TARGET fin.tgt,
    COMPARECOLS
    (ON UPDATE KEYINCLUDING (address, phone, salary, last_mod_time),
    ON DELETE KEYINCLUDING (address, phone, salary, last_mod_time)),
    RESOLVECONFLICT (
    UPDATEROWEXISTS,
    (delta_res_method, USEDELTA, COLS (salary)),
    (DEFAULT, USEMAX (last_mod_time)));

示例 3

本示例演示了 UPDATEROWEXISTS 以及 USEDELTA、USEMAX 和 IGNORE。

MAP fin.src, TARGET fin.tgt,
    COMPARECOLS
    (ON UPDATE ALLEXCLUDING (comment)),
    RESOLVECONFLICT (
    UPDATEROWEXISTS,
    (delta_res_method, USEDELTA, COLS (salary, balance)),
    (max_res_method, USEMAX (last_mod_time), COLS (address, last_mod_time)),
    (DEFAULT, IGNORE));

SQLEXEC (<SQL_specification>)

SQLEXEC 对 TABLE 和 MAP 有效。

在 Oracle GoldenGate 处理期间,使用 SQLEXEC 可在 MAP 语句中执行 SQL 存储过程或查询。借助 SQLEXEC,Oracle GoldenGate 可以直接与数据库通信,以执行数据库支持的任何工作。此工作可以是同步流程的一部分,例如检索列转换的值,也可以独立于提取或复制数据,例如执行在数据库中执行操作的存储过程。

有关语法和用法,请参见 "SQLEXEC "。

SQLPREDICATE 'WHERE <where_clause>'

SQLPREDICATE 对于 Oracle、Db2 LUW、z/OS 上的 Db2、i、PostgreSQL、MySQL、SQL Server 和 Sybase 数据库有效。请勿将 SQLPREDICATE 用于配置为同步事务处理更改的提取组。它仅适用于初始加载提取,因为它将退出直接从表中选择记录的 SELECT 语句。

SQLPREDICATE 与 TABLE 一起使用。

使用 SQLPREDICATE 可在 SELECT 语句中包含常规 SQL WHERE 子句,该子句在提取从表中选择数据以准备初始加载时使用。SQLPREDICATE 将强制选择返回的记录按键值排序。

SQLPREDICATE 是比 WHERE 或 FILTER 选项更快的初始装入选择方法。它直接影响 SQL 语句,并且不需要提取在筛选之前提取所有记录。

对于 Oracle 表,SQLPREDICATE 可减少存储在还原段中的数据量,这可以减少快照太旧错误的发生率。这在加载非常大的表时非常有用。

通过使用 SQLPREDICATE 子句,可以在两个或多个并行提取进程之间对大型表的行进行分区。此配置还使您能够利用并行传送加载处理。

SQLPREDICATE 还允许您根据时间戳或其他标准选择数据,以筛选提取并加载到目标表中的行。SQLPREDICATE 可用于 ORDER BY 子句或任何其他类型的选择子句。

确保 WHERE 子句包含属于键或索引的列。否则,Extract 将执行全表扫描,从而降低 SELECT 语句的效率。

语法

TABLE <source_table>, SQLPREDICATE 'WHERE <where_clause>';

WHERE

这是必需的关键字。

<where_clause>

有效 SQL WHERE 子句,用于从源表中选择记录。

示例

TABLE hr.emp, SQLPREDICATE 'WHERE state = 'CO' and city = 'DENVER''

THREAD (<thread_ID>)

THREAD 对 MAP 有效。当复制处于协调模式时,此选项有效。

使用 THREAD 指定将由指定的复制线程处理同一 MAP 语句中的所有对象。指定的线程处理过滤、操作、传送到目标、错误处理以及为这些对象配置的其他工作。使用 THREAD 时,可以在 TARGET 子句中使用通配符。

必须在同一线程中映射在彼此之间具有引用相关性的所有表。例如,如果表 scott.cust 和 scott.ord 具有外键关系,则以下是可能的映射:

MAP scott.cust, TARGET scott.cust, THREAD (5);
MAP scott.ord, TARGET scott.ord, THREAD (5);

如果省略了 THREAD 或 THREADRANGE 选项,则具有最低线程 ID 的线程始终处理屏障事务。此外,未显式分配给线程的工作将通过此线程进行处理。例如,如果存在 ID 范围为 1 到 10 的线程,则由线程 1 执行屏障和未分配的事务处理。

要在多个线程之间处理 MAP 语句,请参见 THREADRANGE (thread_range,column_list) 。THREAD 和 THREADRANGE 是互斥选项。请勿在同一 MAP 语句中同时使用它们。

语法

THREAD (<thread_ID>)

<thread_ID>

将处理此 MAP 语句的线程的数字标识符。有效值为 1 到使用创建此组的 ADD REPLICAT 命令的 MAXTHREADS 选项指定的值。可以使用 INFO REPLICAT 命令验证复制组允许的最大线程数。指定线程 ID 时,必须满足以下条件:

如果未使用 MAXTHREADS,则缺省最大线程数为 25。

示例

以下示例显示了使用 THREAD 选项的一些方法。

示例 1

在此示例中,线程 1 处理表 cust。

MAP scott.cust, TARGET scott.cust, THREAD (1);

示例 2

在此示例中,线程 1 处理 scott 方案中的所有表。

MAP scott.*, TARGET scott.*, THREAD (1);

示例 3

在此示例中,orders 表通过使用 FILTER (filter_clause) 和 @RANGE 函数在两个 MAP 语句之间进行分区。有关 @RANGE 的更多信息,请参见“@RANGE ”。

MAP scott.orders, TARGET scott.orders, FILTER (@RANGE (1, 2, OID)), THREAD (1);
MAP scott.orders, TARGET scott.orders, FILTER (@RANGE (2, 2, OID)), THREAD (2);

THREADRANGE (<thread_range>,<column_list>)

THREADRANGE 对 MAP 有效。当复制处于协调模式时,此选项有效。

使用 THREADRANGE 指定要根据指定列的值在一系列复制线程之间平均分区目标表的工作量。例如,如果分区基于名为 ID 的列的值,而 THREADRANGE 值为 1-3,则线程 1 处理 1 到 10 的 ID 值的行,线程 2 处理 11 到 20 的 ID 值的行,线程 3 处理 21 到 30 的 ID 值的行。分区可能不会像前面的示例中所示那样绝对,具体取决于工作量的初始计算,但会进行协调,以便始终由同一线程处理同一行。每个指定的线程处理过滤、操作、错误处理、传送到目标及其行范围的其他工作。

在一系列线程中对表进行分区可能会提高非常大的表或表的应用性能,这些表经常发生长时间运行的事务或大量事务,但也可以在其他情况下使用。可以通过相同范围的线程处理多个表。

如果省略了可选列列表,则使用 THREADRANGE 时可以使用通配符 TARGET 子句。使用列列表时,对使用相同线程范围的每个表使用单独的显式 MAP 语句。

要使用一个特定线程处理 MAP 语句,请参见 THREAD (thread_ID) 。THREAD 和 THREADRANGE 是互斥选项。请勿在同一 MAP 语句中同时使用它们。

请勿指定在线程范围内彼此之间具有引用依赖性的表。使用 THREAD 选项并处理具有相同线程的所有表。

请勿使用 THREADRANGE 对序列进行分区。如果需要协调,例如当序列是 SQLEXEC 操作的一部分时,使用 THREAD 选项将序列工作分区到一个线程。

如果省略了 THREAD 或 THREADRANGE 选项,则具有最低线程 ID 的线程始终处理屏障事务。此外,未显式分配给线程的工作将通过此线程进行处理。例如,如果存在 ID 范围为 1 到 10 的线程,则由线程 1 执行屏障和未分配的事务处理。注:列列表中指定的列必须存在于线索文件中。您可以在提取中使用 KEYCOLS 来控制此列,或者通过在提取中对该列使用 FETCHCOLS,或者确保该列是补充日志组的一部分,然后使用 LOGALLSUPCOLS。

语法

THREADRANGE (<lowID>-<highID>, [<column>[, <column>][, ...]])

<lowID>

此范围的最低线程标识符。有效值介于 1 和 500 之间。

<highID>

此范围的最高线程标识符,其数字必须高于 <lowID>。有效值为 <lowID>+1 到 500。范围中的线程数不能超过使用 ADD REPLICAT 命令的 MAXTHREADS 选项指定的值。如果未使用 MAXTHREADS,则缺省最大线程数为 25。

[<column>[, <column>][, ...]]

可选。指定要作为行分区基础的一个或多个唯一列。要指定多个列,请使用逗号分隔的列表,例如 col1, col2, col3。省略此选项时,线程之间的分区默认基于以下列(按显示的首选项顺序):

示例

以下示例根据 OID 列的值将 orders 和 order_lines 表在同一两个线程之间进行分隔。

MAP scott.orders, TARGET scott.orders, THREADRANGE (1-2, OID);
MAP scott.order_lines, TARGET scott.order_lines, THREADRANGE (1-2, OID);

TOKENS (<token_definition>)

TOKENS 对 TABLE 有效。

使用 TOKENS 定义用户令牌并将其与数据关联。使用令牌,可以在线索记录标头的用户令牌区域内提取和存储数据。可以通过多种方式检索和使用令牌数据来定制 Oracle GoldenGate 提供数据的方式。例如,可以在列映射、由 SQLEXEC 调用的存储过程或宏中使用标记数据。

要在目标表中使用定义的标记数据,请在 Replicat MAP 语句的 COLMAP 子句中使用 @TOKEN 列转换函数。@TOKEN 函数将标记的名称映射到目标列。

对于数据泵提取组在直通模式下正在处理的表,请勿使用此选项。

未转换标记数据的字符集。标记必须位于要提取的源数据库的字符集中,并且必须位于要复制的目标数据库的字符集中。

语法

TOKENS (<token_name> = <token_data> [, ...])

<token_name>

令牌的所选名称。它可以是任意数量的有效字符,不区分大小写。不支持多字节名称。

<token_data>

最多 2000 字节的任何有效字符串。数据可以是括在单引号内的文字(如果使用 NOUSEANSISQLQUOTES,则为双引号),也可以是 Oracle GoldenGate 列转换函数的结果。

示例

下面将创建名为 TK-OSUSER、TK-GROUP 和 TK-HOST 的令牌,并将其映射到通过 @GETENV 函数获取的令牌数据。

TABLE ora.oratest, TOKENS (
TK-OSUSER = @GETENV ('GGENVIRONMENT' , 'OSUSERNAME'),
TK-GROUP = @GETENV ('GGENVIRONMENT' , 'GROUPNAME')
TK-HOST =  @GETENV ('GGENVIRONMENT' , 'HOSTNAME'));

TRIMSPACES | NOTRIMSPACES

TRIMSPACES 和 NOTRIMSPACES 对 TABLE 和 MAP 有效。

Use TRIMSPACES and NOTRIMSPACES at the root level of a parameter file or within a TABLE or MAP statement to control whether or not trailing spaces in a source CHAR column are truncated when applied to a target CHAR or VARCHAR column. 默认值为 TRIMSPACES。

有关语法和用法,请参见 "TRIMSPACES | NOTRIMSPACES "。

TRIMVARSPACES | NOTRIMVARSPACES

TRIMVARSPACES 和 NOTRIMVARSPACES 对 TABLE 和 MAP 有效。

Use TRIMVARSPACES and NOTRIMVARSPACES at the root level of a parameter file or within a TABLE or MAP statement to control whether or not trailing spaces in a source VARCHAR column are truncated when applied to a target CHAR or VARCHAR column. The default is NOTRIMVARSPACES.

See “TRIMVARSPACES | NOTRIMVARSPACES” for syntax and usage.

WHERE (<clause>)

WHERE is valid for TABLE and MAP.

Use WHERE to select records based on a conditional statement. WHERE does not support the following:

Enclose literals in single quotes. Specify case-sensitive column names as they are stored in the database, and enclose them in double quotes if the database requires quotes to enforce case-sensitivity (such as Oracle).

Getting More Information about Record Filtering

Syntax

WHERE (<clause>)

<clause>

Selects records based on a condition, such as:

WHERE (branch = 'NY')

Table 2-12 shows permissible WHERE operators.

Table 12 Permissible WHERE Operators

Operator Example
列名 PRODUCT_AMT "Product_Amt"
Numeric values -123, 5500.123
Literal strings enclosed in single quotes 'AUTO', 'Ca'
Column tests @NULL, @PRESENT, @ABSENT (column is null, present or absent in the record). These tests are built into Oracle GoldenGate.
Comparison operators =, <>, >, <,>=, <= < td>
联合运算符 `AND`、`OR`
分组括号 使用左括号和右括号对多个元素进行逻辑分组。

示例

以下 WHERE 示例在 AMOUNT 列超过 10,000 时返回所有记录,并且不会导致在缺少 AMOUNT 时丢弃记录。

WHERE (amount = @PRESENT AND amount > 10000)

分区对象标识

对集成提取有效。

PARTITIONOBJID 用于指定要为分区表捕获的分区的对象 ID,并应用于集成提取。对于 IO 表(有或没有溢出区域),索引段对象 ID 应用于分区级别过滤。在这种情况下,MAP 或 TABLE 语句中的 PARTITIONOBJID 指定要提取的分区的索引段对象 ID。

语法

MAP/TABLE [container.]schema.table PARTITIONOBJID ptn_object_ID [, ptn_object_ID]

适用以下限制:

IO 表 TABLE 语句的语法:

TABLE [container.]schema.table PARTITIONOBJID index_segment_object_ID [, index_segment_object_ID]

IO 表 MAP 语句的语法:

MAP [container.]schema.table PARTITIONOBJID index_segment_object_ID [, index_segment_object_ID]