GET_COLUMN_VALUE_FROM_NAME

有效对象

提取和复制

说明

使用 GET_COLUMN_VALUE_FROM_NAME 函数可使用指定的列名从数据记录中检索列值。列值是用户出口内大多数逻辑的基础。可以基于数据记录中单个列的值来构建复杂逻辑。

如果使用 SET_SESSION_CHARSET 将用户出口的字符会话设置为 ucharset.h 文件的 ULIB_CS_DEFAULT 中定义的操作系统默认字符集以外的值,则将在会话字符集中解释用户出口和进程之间交换的字符数据。

仅当满足以下条件时,才会将列值设置为会话字符集:

如果数据库区分大小写,则必须使用与托管数据库中定义的对象名称相同的字母大小写指定对象名称;否则,大小写无关紧要。

语法

#include "usrdecs.h"
short result_code;
column_def column;
ERCALLBACK (GET_COLUMN_VALUE_FROM_NAME, &column, &result_code);

缓冲区

typedef struct
{
char *column_value;
unsigned short max_value_length;
unsigned short actual_value_length;
short null_value;
short remove_column;
short value_truncated;
short column_index;
char *column_name;
/* Version 3 CALLBACK_STRUCT_VERSION */
short column_value_mode;
short source_or_target;
/* Version 2 CALLBACK_STRUCT_VERSION */
char requesting_before_after_ind;
char more_lob_data;
/* Version 3 CALLBACK_STRUCT_VERSION  */
ULibCharSet column_charset;
} column_def;

输入

<column_value>

指向缓冲区的指针,用于接受返回的列值。

<max_value_length>

返回的列值的最大长度。通常,最大长度是列值缓冲区的长度。如果指定了 ASCII 格式(请参见 column_value_mode),则列值将以 null 结尾,并且最大长度应等于列值的最大长度。

<column_name>

要返回的列值的列名称。

<column_value_mode>

指明列值的字符集。

EXIT_FN_CHAR_FORMAT

ASCII 格式:该值是以 null 结尾的 ASCII(或 EBCDIC)字符串(子数据类型 UTF16_BE 已有例外,该类型转换为 UTF 8。)注意:当向用户出口显示列值时,列值可能会被截断,因为该值被解释为 ASCII 字符串,并且应该以 null 结尾。0 的第一个值将成为字符串终止符。

EXIT_FN_RAW_FORMAT

内部 Oracle GoldenGate 规范格式:此格式包括两个字节的空指示符和两个字节的变量数据长度(如果适用)。对于任何字符数据类型,Oracle GoldenGate 不会为此格式执行字符集转换。

EXIT_FN_CNVTED_SESS_CHAR_FORMAT

用户出口字符集:仅当列数据类型为:

此格式未以 NULL 结尾。

<source_or_target>

以下项之一,指示是使用源数据记录还是目标数据记录检索列值。

EXIT_FN_SOURCE_VAL
EXIT_FN_TARGET_VAL

<requesting_before_after_ind>

在处理后图像记录时设置,并且您希望更新或主键更新的前列。

要在处理主键更新或常规(非键)更新记录的“之后映像”时获取列的“之前”值,请将 requesting_before_after_ind 标志设置为 BEFORE_IMAGE_VAL。

未指定 requesting_before_after_ind 的显式输入时,默认设置为 AFTER_IMAGE_VAL(获取列的后图像)。

要使之前的映像可用,可以使用 GETUPDATEBEFORES 参数,也可以使用 CUSEREXIT 参数语句中的 INCLUDEUPDATEBEFORES 选项。

请注意:

输出

<column_value>

指向返回列值的指针。如果将 column_value_mode 指定为 EXIT_FN_CHAR_FORMAT,则列值将作为以 Null 结尾的 ASCII 字符串返回;否则,列值将以 Oracle GoldenGate 内部规范格式返回。以 ASCII 格式返回日期,格式如下:

CCYY-MM-DD HH:MI:SS.FFFFFF

包含小数时间与数据库相关。

实际时长

返回的列名的字符串长度。当 column_value_mode 指定为 EXIT_FN_CHAR_FORMAT 时,实际长度不包含空终止符。

<null_value>

指示列值是否为空值的标志(0 或 1)。如果 null_value 标志为 1,则列值缓冲区将填充空字节。

<value_truncated>

指示值是否被截断的标志(0 或 1)。如果列值的长度超过最大缓冲区长度,则会发生截断。如果将 column_value_mode 指定为 EXIT_FN_CHAR_FORMAT,则 NULL 终结符将包括在列的长度中。

char more_lob_data

指示初始 4K 以外是否存在更多可存储在基本记录中的 LOB 数据的标志。当 LOB 大于 4K 限制时,它存储在 LOB 片段中。

您必须分配适当的内存量以包含返回的值。Oracle GoldenGate 将始终访问 LOB 列(最多可访问 8K 个数据),将缓冲区填充到用户出口已分配的数量。If the LOB is larger than that which was allocated, subsequent callbacks are required to obtain the total column data, until all data has been sent to the user exit.

要确定数据的结尾,请评估 more_lob_data。在访问新列之前,用户出口会将此标志设置为 CAR_NO_VAL 或 CHAR_YES_VAL。如果此标志在第一次回调后仍处于初始化状态且未设置为 CHAR_YES_VAL 或 CAR_NO_VAL,则以下情况之一为真:

建议您获取源表元数据以确定列是否为 LOB。

返回值

EXIT_FN_RET_BAD_COLUMN_DATA
EXIT_FN_RET_COLUMN_NOT_FOUND
EXIT_FN_RET_INVALID_COLUMN
EXIT_FN_RET_INVALID_CONTEXT
EXIT_FN_RET_INVALID_PARAM
EXIT_FN_RET_OK

示例

memset (&col_meta, 0, sizeof(col_meta));
if (record.mapped)
col_meta.source_or_target = EXIT_FN_TARGET_VAL;
else
col_meta.source_or_target = EXIT_FN_SOURCE_VAL;
col_meta.source_or_target = EXIT_FN_SOURCE_VAL;
col_meta.column_name = (char *)malloc(100);
col_meta.max_name_length = 100;
col_meta.column_index = 1;

call_callback (GET_COL_METADATA_FROM_NAME, &col_meta, &result_code);