使用 ERCALLBACK
ERCALLBACK 是 Oracle GoldenGate 的基本用户出口功能。它用于将记录上下文拉入用户出口。它就像一个包含多个单个函数的程序包。您可以调用这些函数并获取返回值。例如,可以调用 GET_BEFORE_AFTER_IND 或 GET_COLUMN_VALUE_FROM_NAME 等函数。这些函数称为 function_code。
语法
ERCALLBACK (<function_code>, <buffer>, <result_code> );
<function_code>
回调例程要执行的函数。根据传递到回调例程的函数代码,用户回调例程的行为有所不同。虽然某些函数可以同时用于提取和复制,但在一个进程或另一个进程中函数的有效性取决于在回调例程期间为该函数设置的输入参数。有关可用函数代码的完整说明,请参见 Function Codes 。
<buffer>
指向缓冲区的 void 指针,该缓冲区包含与指定函数代码关联的预定义结构。
<result_code>
回调例程执行的函数的状态。回调例程返回的结果代码指示回调函数是否成功。结果代码可以是 Table 4-4 中的值之一。
表 4 结果代码
| 代码 | 说明 |
|---|---|
EXIT_FN_RET_BAD_COLUMN_DATA |
检索或设置列数据时遇到无效数据。 |
EXIT_FN_RET_BAD_DATE_TIME |
日期、时间戳或间隔类型 of 列包含无效的日期或时间值。 |
EXIT_FN_RET_BAD_NUMERIC_VALUE |
列的数字类型包含无效的数值。 |
EXIT_FN_RET_COLUMN_NOT_FOUND |
在压缩的更新记录中未找到该列(由仅记录已更改值的数据库更新)。 |
EXIT_FN_RET_ENV_NOT_FOUND |
在记录中找不到指定的环境值。 |
EXIT_FN_RET_EXCEEDED_MAX_LENGTH |
无法检索元数据,因为表或列的名称不适合分配的缓冲区。 |
EXIT_FN_RET_FETCH_ERROR |
无法提取记录。查看错误消息以查看原因。 |
EXIT_FN_RET_INCOMPLETE_DDL_REC |
处理 DDL 记录时出现内部错误。记录可能不完整。 |
EXIT_FN_RET_INVALID_CALLBACK_FNC_CD |
传递给回调例程的回调函数代码无效。 |
EXIT_FN_RET_INVALID_COLUMN |
在函数调用中引用了不存在的列。 |
EXIT_FN_RET_INVALID_COLUMN_TYPE |
例程正在尝试处理 Oracle GoldenGate 为此不支持的数据类型。 |
EXIT_FN_RET_INVALID_CONTEXT |
回调函数是在不适当的时间调用的。 |
EXIT_FN_RET_INVALID_PARAM |
传递到回调函数的参数无效。 |
EXIT_FN_RET_NO_SRCDB_INSTANCE |
找不到源数据库实例。 |
EXIT_FN_RET_NO_TGTDB_INSTANCE |
找不到目标数据库实例。 |
EXIT_FN_RET_NOT_SUPPORTED |
此流程不支持此功能。 |
EXIT_FN_RET_OK |
回调函数成功。 |
EXIT_FN_RET_SESSION_CS_CNV_ERR |
字符集转换例程返回了 ULIB_ERR_INVALID_CHAR_FOUND 错误。转换失败。 |
EXIT_FN_RET_TABLE_NOT_FOUND |
已指定无效表名。 |
EXIT_FN_RET_TOKEN_NOT_FOUND |
在记录中找不到指定的用户标记。 |
您可以使用 ERCALLBACK 执行许多不同的函数调用。例如,如果要获取表的名称,可以使用以下命令:
ERCALLBACK (GET_TABLE_NAME, &var, &result_code)
这些函数在 c 代码内使用,以便用户出口对函数代码一节中提供的函数执行任何调用。结合使用不同的 function_code 调用,可以使用 ERCALLBACK 执行许多任务,例如:
-
重新创建
DML语句 -
执行转换
-
将特定列从记录中拉出
-
将信息写入报表文件
例如,如果每次心跳表中的滞后超过某个阈值时都需要向报告文件写入消息,则可以使用 CUSEREXIT 函数。然后,CUSEREXIT 函数会多次调用 ERCALLBACK 以获取滞后列数据,执行计算和比较;如果滞后超过指定的阈值,则将消息写入报告文件。