使用 EXCEPTIONSONLY
EXCEPTIONSONLY 对于在 MAP 语句中显式命名和映射一对一的一对源表和目标表有效,即不能存在通配符。要使用 EXCEPTIONSONLY,请为要对目标使用 EXCEPTIONSONLY 的每个源表创建两个 MAP 语句:
-
第一个是标准
MAP语句,将源表映射到实际目标表。 -
第二个是异常 MAP 语句,它将源表映射到异常表(而不是目标表)。异常
MAP语句会在源表出现错误后立即执行,以将行值发送到异常表。要将
MAP语句标识为例外MAP语句,请使用INSERTALLRECORDS和EXCEPTIONSONLY选项。例外MAP语句必须紧跟在包含相同源表的常规MAP语句之后。如果源列和异常表列不相同,或者希望将附加信息映射到异常表中的额外列,例如通过列转换函数或SQLEXEC捕获的信息,请在异常MAP语句中使用COLMAP子句。
有关这些参数的更多信息,请参阅Oracle GoldenGate 的参数和函数参考。
-
将源表
ggs.equip_account映射到其目标表equip_account 2.的常规MAP语句 -
将同一源表映射到异常表
ggs.equip_account_exception的异常MAP语句。
在这种情况下,除了表本身包含的相同列之外,还将创建四个额外的列:
DML_DATE
OPTYPE
DBERRNUM
DBERRMSG
要填充 DML_DATE 列,可以使用 @DATENOW 列转换函数来获取失败操作的日期和时间,并将结果映射到该列。要填充其他额外列,可以使用 @GETENV 函数返回操作类型、数据库错误编号和数据库错误消息。
例外 MAP 语句的 EXCEPTIONSONLY 选项导致该语句仅在对源表执行失败操作后执行。它可防止将每个操作记录到异常表中。
INSERTALLRECORDS 参数会导致指定源表的所有失败操作(无论操作类型如何)以 inserts 形式记录到异常表中。注:异常表不能存在主键或唯一索引限制。在此方案中可能存在唯一性违规,并会生成错误。
示例 9-21 EXCEPTIONSONLY
此示例说明如何将 REPERROR 与 EXCEPTIONSONLY 和异常错误 MAP 语句一起使用。此示例仅显示与 REPERROR 相关的参数;复制也需要其他与错误处理无关的参数。
REPERROR (DEFAULT, EXCEPTION)
MAP ggs.equip_account, TARGET ggs.equip_account2,
COLMAP (USEDEFAULTS);
MAP ggs.equip_account, TARGET ggs.equip_account_exception,
EXCEPTIONSONLY,
INSERTALLRECORDS
COLMAP (USEDEFAULTS,
DML_DATE = @DATENOW (),
OPTYPE = @GETENV ('LASTERR', 'OPTYPE'),
DBERRNUM = @GETENV ('LASTERR', 'DBERRNUM'),
DBERRMSG = @GETENV ('LASTERR', 'DBERRMSG'));
在此示例中,为 DEFAULT 错误处理设置了 REPERROR 参数, EXCEPTION 选项导致 Replicat 进程将失败的操作视为异常错误并继续处理。