GET_COLUMN_VALUE_FROM_NAME
Válido para
Extraer y Replicat
Descripción
Utilice la función GET_COLUMN_VALUE_FROM_NAME para recuperar el valor de columna del registro de datos mediante el nombre de columna especificado. Los valores de columna son la base de la mayoría de la lógica dentro de la salida de usuario. Puede basar la lógica compleja en los valores de columnas individuales dentro del registro de datos.
Si la sesión de caracteres de la salida de usuario se define con SET_SESSION_CHARSET en un valor distinto del juego de caracteres por defecto del sistema operativo, como se define en ULIB_CS_DEFAULT en el archivo ucharset.h, los datos de caracteres que se intercambian entre la salida de usuario y el proceso se interpretan en el juego de caracteres de la sesión.
Un valor de columna se define en el juego de caracteres de la sesión solo si se cumple lo siguiente:
-
El valor de columna es un tipo de carácter SQL (
CHAR/VARCHAR2/CLOB,NCHAR/NVARCHAR2/NCLOB), una fecha/registro de hora/intervalo/tipo de número SQL -
El indicador
column_value_modese define enEXIT_FN_CNVTED_SESS_CHAR_FORMAT.
Si la base de datos distingue entre mayúsculas y minúsculas, los nombres de objetos se deben especificar en las mismas mayúsculas y minúsculas que se definen en la base de datos de alojamiento; de lo contrario, las mayúsculas y minúsculas no importan.
Sintaxis
#include "usrdecs.h"
short result_code;
column_def column;
ERCALLBACK (GET_COLUMN_VALUE_FROM_NAME, &column, &result_code);
Buffer
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;
Entrada
<column_value>
Un puntero a un buffer para aceptar el valor de columna devuelto.
<max_value_length>
Longitud máxima del valor de columna devuelto. Normalmente, la longitud máxima es la longitud del buffer de valor de columna. Si se especifica el formato ASCII (consulte column_value_mode), el valor de columna es nulo y la longitud máxima debe ser igual a la longitud máxima del valor de columna.
<column_name>
Nombre de la columna para el valor de columna que se va a devolver.
<column_value_mode>
Indica el juego de caracteres del valor de columna.
EXIT_FN_CHAR_FORMAT
Formato ASCII: el valor es una cadena ASCII (o EBCDIC) con terminación nula (con una excepción conocida para el tipo de subdatos UTF16_BE, que se convierte a UTF 8). Nota: Un valor de columna se puede truncar cuando se presenta a una salida de usuario, porque el valor se interpreta como una cadena ASCII y se supone que está terminada en un valor nulo. El primer valor de 0 se convierte en el terminador de cadena.
-
Las fechas tienen el formato
CCYY-MM-DD HH:MI:SS.FFFFFF, en el que el tiempo fraccional depende de la base de datos. -
Los valores numéricos tienen el formato de cadena. Por ejemplo,
123.45se representa como"123.45". -
Los caracteres no imprimibles o los valores binarios se convierten en notación hexadecimal.
-
Los tipos de punto flotante se muestran como cadenas de terminación nula, con los primeros 14 dígitos significativos.
EXIT_FN_RAW_FORMAT
Formato canónico interno de Oracle GoldenGate: este formato incluye un indicador nulo de dos bytes y una longitud de datos variable de dos bytes cuando corresponde. Oracle GoldenGate no realiza ninguna conversión de juego de caracteres para este formato para ningún tipo de dato de carácter.
EXIT_FN_CNVTED_SESS_CHAR_FORMAT
Juego de caracteres de salida de usuario: esto solo se aplica si el tipo de dato de columna es:
-
un tipo basado en caracteres, uno o varios bytes
-
un tipo numérico con una representación de cadena
Este formato no es nulo.
<source_or_target>
Una de las siguientes indicaciones indica si se debe utilizar el registro de datos de origen o de destino para recuperar el valor de columna.
EXIT_FN_SOURCE_VAL
EXIT_FN_TARGET_VAL
<requesting_before_after_ind>
Se define al procesar un registro de imagen posterior y desea que las columnas anteriores de una actualización o una actualización de clave primaria.
Para obtener el valor "before" de la columna mientras se procesa una "after image" de una actualización de clave primaria o un registro de actualización normal (no clave), defina el indicador requesting_before_after_ind en BEFORE_IMAGE_VAL.
-
Para acceder a la imagen anterior de las columnas de clave de una actualización de clave primaria, no se necesita nada más.
-
Para acceder a las columnas no clave de una actualización de clave primaria o cualquier columna de una actualización normal, la imagen anterior debe estar disponible.
El valor por defecto es AFTER_IMAGE_VAL (obtener la imagen posterior de la columna) cuando no se especifica una entrada explícita para requesting_before_after_ind.
Para que una imagen anterior esté disponible, puede utilizar el parámetro GETUPDATEBEFORES o puede utilizar la opción INCLUDEUPDATEBEFORES en la sentencia del parámetro CUSEREXIT.
Debe tener en cuenta lo siguiente:
-
GETUPDATEBEFOREShace que un proceso Extract escriba registros de imagen anterior en la pista y también realice una llamadaEXIT_CALL_PROCESS_RECORDa la salida de usuario con las imágenes anteriores. -
INCLUDEUPDATEBEFORESno provoca una llamadaEXIT_CALL_PROCESS_RECORDa la salida de usuario ni, en el caso de Extract, hace que el proceso escriba la imagen anterior en la pista.
Salida
<column_value>
Un puntero al valor de columna devuelto. Si se especifica column_value_mode como EXIT_FN_CHAR_FORMAT, el valor de columna se devuelve como una cadena ASCII con terminación nula; de lo contrario, el valor de columna se devuelve en el formato canónico interno de Oracle GoldenGate. En formato ASCII, las fechas se devuelven con el siguiente formato:
CCYY-MM-DD HH:MI:SS.FFFFFF
La inclusión del tiempo fraccional depende de la base de datos.
longitud real
Longitud de cadena del nombre de columna devuelto. La longitud real no incluye un terminador nulo cuando column_value_mode se especifica como EXIT_FN_CHAR_FORMAT.
<null_value>
Indicador (0 o 1) que indica si el valor de columna es nulo o no. Si el indicador null_value es 1, el buffer de valor de columna se rellena con bytes nulos.
<value_truncated>
Indicador (0 o 1) que indica si el valor se ha truncado o no. El truncamiento se produce si la longitud del valor de columna supera la longitud máxima del buffer. Si column_value_mode se ha especificado como EXIT_FN_CHAR_FORMAT, el terminador nulo se incluye en la longitud de la columna.
carácter more_lob_data
Indicador que indica si hay más datos LOB más allá del valor inicial 4K que se pueden almacenar en el registro base. Cuando un LOB es mayor que el límite 4K, se almacena en fragmentos LOB.
Debe asignar la cantidad de memoria adecuada para contener los valores devueltos. Oracle GoldenGate accederá a las columnas LOB hasta 8K de datos en todo momento, rellenando el buffer con la cantidad asignada por la salida de usuario. Si LOB es mayor que el que se asignó, se necesitan devoluciones de llamada posteriores para obtener el total de datos de columna, hasta que se hayan enviado todos los datos a la salida de usuario.
Para determinar el final de los datos, evalúe more_lob_data. La salida de usuario define este indicador en CAR_NO_VAL o CHAR_YES_VAL antes de acceder a una nueva columna. Si este indicador se sigue inicializando después de la primera devolución de llamada y no se define en CHAR_YES_VAL ni en CAR_NO_VAL, se cumple una de las siguientes condiciones:
-
Se ha asignado suficiente memoria para manejar
LOB. -
No es un
LOB. -
No superó el límite 4K del tamaño del registro de pista base.
Se recomienda obtener los metadatos de la tabla de origen para determinar si una columna puede ser LOB.
Valores devueltos
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
Ejemplo
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);