Asignación y transformación de datos

Obtenga información sobre las tareas, funciones, comandos y procesos que se utilizan para integrar datos entre las tablas de origen y de destino.

Parámetros que controlan la asignación y la integración de datos

Toda la selección, asignación y manipulación de datos que realiza Oracle GoldenGate se realiza mediante una o más opciones de los parámetros TABLE y MAP.

TABLE y MAP especifican los objetos de base de datos que se ven afectados por los otros parámetros del archivo de parámetros. Consulte Especificación de nombres de objetos en la entrada de Oracle GoldenGate para obtener instrucciones sobre cómo especificar nombres de objetos en estos parámetros.

Asignación entre bases de datos diferentes

La asignación y conversión entre tablas que tienen diferentes estructuras de datos requiere un archivo de definiciones de origen, un archivo de definiciones de destino o, en algunos casos, ambos. La asignación entre bases de datos diferentes se controla mediante las pistas de autodescripción y la asignación se realiza por nombre de columna, independientemente del tipo de dato de la columna de origen o de destino.

Si no desea una asignación automática basada en las pistas de autodescripción o desea compatibilidad con versiones anteriores, puede utilizar SOURCEDEFS o TARGETDEFS.

Asignación y Conversión en Sistemas NonStop

Si está asignando o convirtiendo datos de un sistema Windows o UNIX a un destino NonStop Enscribe, la asignación o conversión se debe realizar en el sistema de origen Windows o UNIX. Replicat para NonStop no puede convertir los nombres de tabla SQL de tres o dos partes y los tipos de dato en los nombres de archivo de tres partes que se utilizan para la plataforma Enscribe. Extract puede formatear los datos de pista con los nombres de Enscribe y los tipos de dato de destino.

Asignación y conversión en sistemas Windows y UNIX

Cuando Oracle GoldenGate sólo funciona en sistemas basados en Windows y UNIX, la asignación y conversión de columnas se pueden realizar en el proceso Extract o en el proceso Replicat. Para evitar la sobrecarga añadida de este proceso en el proceso de extracción, puede configurar la asignación y la conversión que se realizará en el proceso de Replicat o en un sistema intermediario.

En el caso de que haya varios orígenes y un destino, puede ser más eficaz realizar la asignación y la conversión en el origen.

Consideraciones de Globalización al Asignar Datos

Al planificar la asignación y conversión de datos entre bases de datos y plataformas, tenga en cuenta lo que soporta o no Oracle GoldenGate en términos de globalización.

Conversión entre juegos de caracteres

Oracle GoldenGate convierte entre los juegos de caracteres de origen y destino si son diferentes, de modo que los nombres de objeto y los datos de columna se comparan, asignan y manipulan correctamente de una base de datos a otra. Consulte Juegos de Caracteres Soportados para obtener una lista de los conjuntos de caracteres soportados.

Para garantizar una representación precisa de los caracteres de una base de datos a otra, se debe cumplir lo siguiente:

En esta configuración, cada carácter se representa al convertir de un juego de caracteres de origen o cliente al juego de caracteres de la base de datos local.

Un proceso de Replicat puede soportar la conversión de un juego de caracteres de origen a un juego de caracteres de destino.

Nombres de Objetos de Base de Datos

Oracle GoldenGate procesa los nombres de catálogo, esquema, tabla y columna en su idioma nativo, según lo determinado por la codificación del juego de caracteres de las bases de datos de origen y destino. Este soporte conserva los nombres de un solo byte y multibyte, los símbolos, los caracteres de acento y la sensibilidad a mayúsculas y minúsculas, teniendo en cuenta la configuración regional cuando esté disponible, en todos los niveles de la jerarquía de la base de datos.

Datos de Columna

Oracle GoldenGate soporta la conversión de datos de columna entre juegos de caracteres cuando los datos están incluidos en los siguientes tipos de columna:

La conversión del juego de caracteres para los datos de columna se limita a una asignación directa de una columna de origen y una columna de destino en las cláusulas COLMAP o USEDEFAULTS del parámetro Replicat MAP. Una asignación directa es una asignación de nombre a nombre sin el uso de un procedimiento almacenado o una función de conversión de columna. Replicat realiza la conversión del juego de caracteres. Extract no realiza ninguna conversión.

Conservación de la configuración regional

Oracle GoldenGate tiene en cuenta la configuración regional de la base de datos al comparar nombres de objetos no sensibles a mayúsculas/minúsculas. Consulte Supported Locales para obtener una lista de las configuraciones regionales soportadas.

Soporte para secuencias de escape

Oracle GoldenGate soporta el uso de una secuencia de escape para representar una columna de cadena, un texto literal o un nombre de objeto en el archivo de parámetros. Puede utilizar una secuencia de escape si el sistema operativo no soporta el carácter necesario, como un carácter de control, o para cualquier otro fin que requiera un carácter que no se pueda utilizar en un archivo de parámetros.

Una secuencia de escape se puede utilizar en cualquier lugar del archivo de parámetros, pero es especialmente útil en los siguientes elementos de una sentencia TABLE o MAP:

Oracle GoldenGate soporta los siguientes tipos de secuencia de escape:

Se aplica la siguiente regla:

Para utilizar la secuencia de escape \uFFFF Unicode

\u20ac es la secuencia de escape Unicode para el signo de moneda euro.

Nota: Para una compatibilidad entre plataformas fiable, utilice la secuencia de escape Unicode. Las secuencias de escape octales y hexadecimales no están estandarizadas en diferentes sistemas operativos.

Para usar la secuencia de escape octal \377

Para utilizar la \xFF Hexadecimal Escape Eequence

\x80 es la secuencia de escape hexadecimal para el signo de moneda Euro en la página de código Latin1 de Microsoft Windows 1252.

Asignación de Columnas mediante TABLE y MAP

Oracle GoldenGate proporciona la asignación de columnas a nivel de tabla y a nivel global. La asignación de columnas por defecto también se proporciona en ausencia de reglas de asignación de columnas explícitas.

Esta sección contiene las siguientes directrices para la asignación de columnas:

Caso de soporte y caracteres especiales en los nombres de columna

Por defecto, Oracle GoldenGate sigue las reglas SQL-92 para especificar nombres de columna y literales. En los archivos de parámetros, las funciones de conversión, las salidas de usuario y los comandos de Oracle GoldenGate, los nombres de columna sensibles a mayúsculas/minúsculas se deben incluir entre comillas dobles si la base de datos necesita comillas dobles para aplicar la distinción entre mayúsculas y minúsculas. Para otras bases de datos sensibles a mayúsculas/minúsculas que no necesitan comillas, los nombres de columna sensibles a mayúsculas/minúsculas se deben especificar a medida que se almacenan en la base de datos. Los literales se deben incluir entre comillas simples. Consulte Diferenciación de nombres de columnas sensibles a mayúsculas/minúsculas de literales para obtener más información.

Configuración de la Asignación de Columnas a Nivel de Tabla con COLMAP

Si utiliza pistas de autodescripción, cualquier columna del objeto de origen se asigna al mismo nombre de columna en el objeto de destino. Solo tiene que gestionar nombres de columna que sean diferentes entre el origen y el destino o si necesita transformar una columna.

Sin embargo, si no se utilizan pistas de autodescripción, la asignación predeterminada se realiza por orden de columna y no por nombre de columna. Por lo tanto, la columna 1 del origen se asignará a la columna 1 del destino, la columna 2 a la columna 2, etc.

Utilice la opción COLMAP de los parámetros MAP y TABLE para:

Uso de USEDEFAULTS para habilitar la asignación de columnas predeterminada

Puede utilizar la opción USEDEFAULTS de COLMAP para especificar la asignación automática de columnas por defecto para cualquier columna de origen y destino correspondiente que tenga nombres idénticos. USEDEFAULTS puede ahorrarle tiempo al eliminar la necesidad de asignar explícitamente cada columna de destino.

La asignación por defecto hace que Oracle GoldenGate asigne esas columnas y, si es necesario, traduzca los tipos de dato según el archivo de definiciones de datos. No especifique la asignación por defecto para las columnas que ya están asignadas con una sentencia de asignación explícita.

El siguiente ejemplo de asignación de columnas ilustra el uso de la asignación de columnas explícitas y por defecto para una tabla de origen ACCTBL y una tabla de destino ACCTTAB. La mayoría de las columnas son iguales en ambas tablas, excepto por las siguientes diferencias:

Para abordar esas diferencias, USEDEFAULTS se utiliza para asignar las columnas similares automáticamente, mientras que las funciones de asignación y conversión explícitas se utilizan para columnas diferentes.

En el siguiente ejemplo se muestra la asignación de columnas mediante la opción COLMAP de los parámetros MAP y TABLE. Describe la asignación de la tabla de origen ACCTBL a la tabla de destino ACCTTAB.

MAP SALES.ACCTBL, TARGET SALES.ACCTTAB,
                COLMAP (   USEDEFAULTS,
                           NAME = CUST_NAME,
                           TRANSACTION_DATE = @DATE ('YYYY-MM-DD', 'YY',YEAR, 'MM', MONTH, 'DD', DAY),
                           AREA_CODE = @STREXT (PHONE_NO, 1, 3),
                           PHONE_PREFIX = @STREXT (PHONE_NO, 4, 6),
                           PHONE_NUMBER = @STREXT (PHONE_NO, 7, 10)
)
;

Tabla 3: Asignación de columnas de ejemplo

Sentencia de parámetro Descripción
COLMAP Inicia la sentencia COLMAP.
USEDEFAULTS, Asigna las columnas de origen tal cual cuando los nombres de columna de destino son idénticos.
NAME = CUST_NAME, Asigna la columna de origen CUST_NAME a la columna de destino NAME.
TRANSACTION_DATE = @DATE ('YYYY-MM-DD', 'YY', YEAR, 'MM', MONTH, 'DD', DAY), Convierte la fecha de transacción de las columnas de fecha de origen a la columna de destino TRANSACTION_DATE mediante la función de conversión de columna @DATE.
AREA_CODE = @STREXT (PHONE_NO, 1, 3), PHONE_PREFIX = @STREXT (PHONE_NO, 4, 6), PHONE_NUMBER = @STREXT (PHONE_NO, 7, 10)) ; Convierte la columna de origen PHONE_NO en las columnas de destino independientes AREA_CODE, PHONE_PREFIX y PHONE_NUMBER mediante la función de conversión de columna @STREXT.

Consulte Descripción de la asignación de columnas por defecto para obtener más información sobre las reglas seguidas por Oracle GoldenGate para la asignación de columnas por defecto.

Especificación de las columnas que se asignarán en la cláusula COLMAP

La sintaxis COLMAP es la siguiente:

COLMAP ([USEDEFAULTS, ] target_column = source_expression)

En esta sintaxis, target_column es el nombre de la columna de destino y source_expression. Algunos ejemplos de source_expressions son:

Si la asignación de columnas implica columnas sensibles a mayúsculas/minúsculas de diferentes tipos de base de datos, especifique cada columna tal y como se almacena en la base de datos.

A continuación, se muestra una asignación entre una columna de destino en una instancia de Oracle AI Database y una columna de origen en una base de datos de SQL Server sensible a mayúsculas/minúsculas.

COLMAP ("ColA" = ColA)

Consulte Especificación de nombres de objetos en entrada de Oracle GoldenGate para obtener más información sobre la especificación de nombres en Oracle GoldenGate.

Consulte Consideraciones de globalización al asignar datos para conocer las consideraciones de globalización al asignar columnas de origen y destino en bases de datos que tienen diferentes juegos de caracteres y configuraciones regionales.

Evite utilizar COLMAP para asignar un valor a una columna de clave (lo que hace que la operación se convierta en una actualización de clave primaria). La cláusula WHERE que Oracle GoldenGate utiliza para localizar la fila de destino no utilizará la imagen anterior correcta de la columna de clave. En su lugar, utilizará la imagen posterior. Esto provocará errores si utiliza alguna función basada en esa columna de clave, como una sentencia SQLEXEC.

Limitaciones de asignación de columnas

A continuación, se muestran las limitaciones de asignación de columnas:

Configuración de la Asignación de Columnas Globales con COLMATCH

Utilice el parámetro COLMATCH para crear reglas globales para la asignación de columnas. Con COLMATCH, puede realizar asignaciones entre tablas con estructura similar que tienen diferentes nombres de columna para los mismos juegos de datos. COLMATCH proporciona una forma más conveniente de asignar columnas de este tipo que mediante la asignación de nivel de tabla con una cláusula COLMAP en sentencias TABLE o MAP individuales.

La sensibilidad a mayúsculas/minúsculas se admite de la siguiente manera:

Sintaxis

COLMATCH
{NAMES target_column = source_column |
PREFIX prefix |
SUFFIX suffix |
RESET}
Argumento Descripción
NAMES target_column = source_column Se asigna según los nombres de columna. Coloque comillas dobles alrededor del nombre de columna si es sensible a mayúsculas/minúsculas y la base de datos necesita comillas para aplicar la sensibilidad a mayúsculas/minúsculas. Para estos tipos de base de datos, Oracle GoldenGate considera que un nombre de columna sin comillas no distingue entre mayúsculas y minúsculas. Para las bases de datos que soportan la distinción entre mayúsculas y minúsculas sin necesidad de comillas, especifique el nombre de columna tal y como se almacena en la base de datos. Si COLMATCH se encuentra entre columnas de diferentes tipos de base de datos, asegúrese de que los nombres reflejen la representación de mayúsculas/minúsculas adecuada para cada una. Por ejemplo, a continuación se especifica un nombre de columna de destino sensible a mayúsculas/minúsculas "aBc" en Oracle AI Database y un nombre de columna de origen sensible a mayúsculas/minúsculas aBc en una base de datos de SQL Server sensible a mayúsculas/minúsculas: COLMATCH NAMES "aBc" = aBc.
PREFIX prefix / SUFFIX suffix Ignora el prefijo o sufijo de nombre especificado. Coloque comillas dobles alrededor del prefijo o sufijo si la base de datos necesita comillas para aplicar la distinción entre mayúsculas y minúsculas, por ejemplo, "P_". Para esos tipos de base de datos, un prefijo o sufijo sin comillas se trata como no sensible a mayúsculas/minúsculas. Para bases de datos que soportan la distinción entre mayúsculas y minúsculas sin necesidad de comillas, especifique el prefijo o sufijo tal y como se almacena en la base de datos. Por ejemplo, "P_" especifica un prefijo P mayúscula. El siguiente ejemplo especifica un prefijo que no distingue entre mayúsculas y minúsculas para ignorar: COLMATCH PREFIX p_. El nombre de columna de destino P_ABC se asigna al nombre de columna de origen ABC y el nombre de columna de destino P_abc se asigna al nombre de columna de origen abc. En el siguiente ejemplo se especifica un sufijo sensible a mayúsculas/minúsculas que se debe ignorar: SUFFIX "_k". El nombre de columna de destino ABC_k se asigna al nombre de columna de origen ABC y el nombre de columna de destino "abc_k" se asigna al nombre de columna de origen abc.
RESET Desactiva las reglas COLMATCH definidas previamente para las sentencias TABLE o MAP posteriores.

El siguiente ejemplo ilustra cuándo utilizar COLMATCH. Las tablas de origen y destino son idénticas, excepto que la tabla ligeramente diferente y la base de datos names.The de columna no son sensibles a mayúsculas/minúsculas.

Tabla ACCT Tabla ORD
CUST_CODE CUST_NAME CUST_ADDR PHONE S_REP S_REPCODE CUST_CODE CUST_NAME ORDER_ID ORDER_AMT S_REP S_REPCODE
Tabla de CUENTAS Tabla ORDER
CUSTOMER_CODE CUSTOMER_NAME CUSTOMER_ADDRESS PHONE REP REPCODE CUSTOMER_CODE CUSTOMER_NAME ORDER_ID ORDER_AMT REP REPCODE

Para asignar las columnas de origen a las columnas de destino en este ejemplo, así como para manejar asignaciones posteriores para otras tablas, la sintaxis es:

COLMATCH NAMES CUSTOMER_CODE = CUST_CODE
COLMATCH NAMES CUSTOMER_NAME = CUST_NAME
COLMATCH NAMES CUSTOMER_ADDRESS = CUST_ADDR
COLMATCH PREFIX S_
MAP SALES.ACCT, TARGET SALES.ACCOUNT, COLMAP (USEDEFAULTS);
MAP SALE.ORD, TARGET SALES.ORDER, COLMAP (USEDEFAULTS);
COLMATCH RESET
MAP SALES.REG, TARGET SALE.REG;
MAP SALES.PRICE, TARGET SALES.PRICE;

Según las reglas del ejemplo, se produce lo siguiente:

Concepto de asignación de columnas por defecto

Para las pistas de autodescripción, si no existe una asignación de columna explícita, ya sea mediante COLMATCH o COLMAP, Oracle GoldenGate asigna las columnas de origen y destino por defecto según las siguientes reglas.

Esto no se aplica si utiliza SOURCEDEFS o TARGETDEFS.

Si no se puede realizar la asignación por defecto, la columna de destino toma por defecto uno de los valores que se muestran en la siguiente tabla.

Tipo de columna Valor
Numérico Cero (0)
Caracteres o VARCHAR Espacios
Fecha o fecha/hora Fecha y hora actual
Columnas que pueden tomar un valor NULL Nulo

Conversiones de tipo de datos

Obtenga información sobre cómo Oracle GoldenGate asigna los tipos de dato.

Columnas numéricas

Las columnas numéricas se convierten para que coincidan con el tipo y la escala de la columna de destino. Si la escala de la columna de destino es menor que la del origen, el número se trunca a la derecha. Si la escala de la columna de destino es mayor que la del origen, el número se rellena con ceros a la derecha.

Puede especificar un valor de sustitución para los datos numéricos no válidos encontrados al asignar columnas de número mediante el parámetro REPLACEBADNUM para obtener más información.

Columnas de tipo carácter

Las columnas de tipo de carácter pueden aceptar tipos de dato basados en caracteres como VARCHAR, numéricos en formato de cadena, fecha y hora en formato de cadena y literales de cadena. Si la escala de la columna de destino es menor que la del origen, la columna se trunca a la derecha. Si la escala de la columna de destino es mayor que la del origen, la columna se rellena con espacios a la derecha.

Los literales se deben incluir entre comillas simples.

Puede controlar la respuesta del proceso de Oracle GoldenGate cuando no existe un punto de código válido para el juego de caracteres de origen o de destino al asignar columnas de caracteres mediante el parámetro REPLACEBADCHAR para obtener más información.

Columnas de fecha y hora

Las columnas (DATE, TIME y TIMESTAMP de fecha y hora pueden aceptar columnas de fecha y hora y caracteres, así como literales de cadena. Los literales se deben incluir entre comillas simples. Para asignar una columna de caracteres a una columna de fecha y hora, asegúrese de que cumple el formato SQL externo de Oracle GoldenGate de YYYY-MM-DD HH:MI:SS.FFFFFF.

Oracle GoldenGate soporta datos de registro de hora de 0001-01-03 00:00:00 a 9999-12-31 23:59:59. Si se convierte un registro de hora de GMT a la hora local, estos límites también se aplican al registro de hora resultante. Dependiendo de la zona horaria, la conversión puede sumar o restar horas, lo que puede hacer que el registro de hora supere el límite admitido inferior o superior.

La precisión requerida varía según el tipo de dato y la plataforma de destino. Si la escala de la columna de destino es menor que la del origen, los datos se truncan a la derecha. Si la escala de la columna de destino es mayor que la del origen, la columna se amplía a la derecha con los valores de la fecha y hora actuales.

Selección y filtrado de filas

El filtrado solo se puede realizar en columnas que estén disponibles para Oracle GoldenGate. En TRANLOG Extract, Oracle GoldenGate tiene acceso a todas las columnas que están presentes en los redo logs y en la base de datos. Si las columnas no están en los redo logs, se deben recuperar explícitamente (mediante FETCHCOLS) para poder filtrarlas. En la bomba Extract y en Replicat, las columnas deben estar disponibles en el archivo de pista. Por este motivo, cualquier columna que desee utilizar en una cláusula FILTER o WHERE se debe registrar explícitamente mediante ADD TRANDATA COLS y debe conservar el valor por defecto de LOGALLSUPCOLS.

Para filtrar o seleccionar filas para extracción o replicación, utilice las cláusulas FILTER y WHERE de los parámetros TABLE y MAP.

La cláusula FILTER ofrece más funcionalidad que la cláusula WHERE porque puede emplear cualquiera de las funciones de conversión de columna de Oracle GoldenGate, mientras que la cláusula WHERE acepta operadores WHERE básicos.

Selección de Filas con una Cláusula FILTER

Utilice una cláusula FILTER para seleccionar filas basadas en un valor numérico mediante operadores básicos o una o más funciones de conversión de columnas de Oracle GoldenGate.

Nota: Para filtrar una columna según una cadena, utilice una de las funciones de cadena de Oracle GoldenGate o utilice una cláusula WHERE.

La sintaxis para FILTER en una sentencia TABLE es la siguiente:

TABLE source_table
, FILTER (
[, ON INSERT | ON UPDATE| ON DELETE]
[, IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE]
, filter_clause);

La sintaxis para FILTER en una sentencia MAP es la siguiente e incluye una opción de manejo de errores.

MAP source_table, TARGET target_table,
, FILTER (
[, ON INSERT | ON UPDATE| ON DELETE]
[, IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE]
[, RAISEERROR error_number]
, filter_clause);

Los elementos válidos de la cláusula FILTER son los siguientes:

Utilice las siguientes opciones FILTER para especificar a qué operaciones SQL afecta una cláusula de filtro. Cualquiera de estas opciones se puede combinar.

ON INSERT | ON UPDATE | ON DELETE IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE

Utilice la opción RAISEERROR de FILTER en el parámetro MAP para generar un error definido por el usuario cuando falle el filtro. Esta opción resulta útil cuando se necesita disparar un evento como respuesta al fallo.

Utilice la función @RANGE en una cláusula FILTER para distribuir la carga de trabajo de procesamiento entre varias sentencias MAP o TABLE.

A continuación se muestra una muestra:

REPERROR (9999, EXCEPTION)
MAP OWNER.SRCTAB, TARGET OWNER.TARGTAB,
                   SQLEXEC (ID CHECK, ON UPDATE, QUERY ' SELECT COUNT FROM TARGTAB WHERE PKCOL = :P1 ', PARAMS (P1 = PKCOL)),
                   FILTER (BALANCE > 15000),
                   FILTER (ON UPDATE, @BEFORE (COUNT) = CHECK.COUNT)
;
MAP OWNER.SRCTAB, TARGET OWNER.TARGEXC,
EXCEPTIONSONLY,
COLMAP (   USEDEFAULTS,
ERRTYPE = 'UPDATE FILTER FAILED'
)
;

Tabla 4 Uso de varias sentencias FILTER

Archivo de parámetros Descripción
REPERROR (9999, EXCEPTION) Emite una excepción para el error especificado.
MAP OWNER.SRCTAB, TARGET OWNER.TARGTAB, Inicia la sentencia MAP.
SQLEXEC (ID CHECK, ON UPDATE, QUERY ' SELECT COUNT FROM TARGTAB ' 'WHERE PKCOL = :P1 ', PARAMS (P1 = PKCOL)), Realiza una consulta para recuperar el valor actual de la columna COUNT siempre que se encuentre una actualización. También hay una opción BEFOREFILTER que permite ejecutar la consulta o el procedimiento almacenado antes de procesar la cláusula FILTER. Esto permite que los valores de la parte SQLEXEC se utilicen en FILTER en tiempo de ejecución.
FILTER (BALANCE > 15000), Utiliza una cláusula FILTER para seleccionar filas en las que el saldo sea mayor que 15000.
FILTER (ON UPDATE, @BEFORE (COUNT) = CHECK.COUNT) Utiliza otra cláusula FILTER para garantizar que el valor de la columna COUNT de origen antes de una actualización coincida con el valor de la columna de destino antes de aplicar la actualización de destino.
; El punto y coma concluye la sentencia MAP.
MAP OWNER.SRCTAB, TARGET OWNER.TARGEXC, EXCEPTIONSONLY, COLMAP (USEDEFAULTS, ERRTYPE = 'UPDATE FILTER FAILED'); Designa una sentencia MAP de excepciones. La cláusula REPERROR para el error 9999 garantiza que se ejecutarán las excepciones asignadas a TARGEXC.

Ejemplo 9-5 Llamada a la función @COMPUTE

En el ejemplo siguiente se llama a la función @COMPUTE para extraer registros en los que el precio multiplicado por el importe supera los 10 000.

MAP SALES.TCUSTORD, TARGET SALES.TORD,
FILTER (@COMPUTE (PRODUCT_PRICE * PRODUCT_AMOUNT) > 10000);

Ejemplo 9-6 Llamada a la función @STREQ

A continuación se utiliza la función @STREQ para extraer registros en los que el valor de una columna de caracteres es 'JOE'.

TABLE ACCT.TCUSTORD, FILTER (@STREQ ("Name", 'joe') > 0);

Ejemplo 9-7 Selección de registros

A continuación, se seleccionan los registros en los que la columna AMOUNT es mayor que 50 y se ejecuta el filtro en las operaciones UPDATE y DELETE.

TABLE ACT.TCUSTORD, FILTER (ON UPDATE, ON DELETE, AMOUNT > 50);

Ejemplo 9-8 Uso de la función @RANGE

(Archivo de parámetros del grupo 1 de Replicat)

MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (1, 2, ID));

(Archivo de parámetros del grupo 2 de Replicat)

MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (2, 2, ID));

Puede combinar varias cláusulas FILTER en una sentencia MAP o TABLE, como se muestra en la Table 9-4, que muestra parte de un archivo de parámetros Replicat. Oracle GoldenGate ejecuta los filtros en el orden indicado, hasta que uno falla o hasta que se transfieren todos. Si un filtro falla, todos fallan.

Selección de filas con una cláusula WHERE

Utilice cualquiera de los elementos de la Tabla 9-5 en una cláusula WHERE para seleccionar o excluir filas (o ambas) basadas en una sentencia condicional. Cada cláusula WHERE se debe incluir entre paréntesis. Los literales se deben incluir entre comillas simples.

Tabla 5 Operadores WHERE permitidos

Elemento Ejemplos
Nombres de Columna PRODUCT_AMT
Valores numéricos -123, 5500.123
Cadenas literales 'AUTO', 'Ca'
Pruebas de columna incorporadas @NULL, @PRESENT, @ABSENT (la columna es nula, está presente o ausente en la fila). Estas pruebas están integradas en Oracle GoldenGate. Consulte Consideraciones para seleccionar filas con FILTER y WHERE.
Operador de comparación =, <>, >, <, >=, <=
Operadores conjuntivos AND, OR
Agrupación de paréntesis Utilice paréntesis de apertura y cierre ( ) para la agrupación lógica de varios elementos.

Oracle GoldenGate no soporta FILTER para las columnas que tienen un juego de caracteres de varios bytes o un juego de caracteres que no es compatible con el juego de caracteres del sistema operativo local.

Los operadores aritméticos y los tipos de dato de punto flotante no están soportados por WHERE. Para utilizar condiciones de selección más complejas, utilice una cláusula FILTER o una rutina de salida de usuario.

La sintaxis para WHERE es idéntica en las sentencias TABLE y MAP:

TABLE table, WHERE (clause);
MAP source_table, TARGET target_table, WHERE (clause);

Consideraciones para la selección de filas con FILTER y WHERE

Las siguientes sugerencias pueden ayudarle a crear una cláusula de selección correcta. Nota: En los ejemplos de esta sección se asume que una base de datos no distingue entre mayúsculas y minúsculas.

Garantía de Disponibilidad de Datos para Filtros

Si la base de datos solo registra valores para columnas cambiadas en el log de transacciones, puede haber errores si los criterios de selección hacen referencia a cualquiera de las columnas no modificadas. Oracle GoldenGate ignora dichas operaciones de fila, las envía al archivo de descarte y emite una advertencia.

Para evitar errores de columnas faltantes, cree las condiciones de selección de la siguiente manera:

TABLE DEMO.PEOPLE, FETCHBEFOREFILTER, FETCHCOLS (age), FILTER (age > 50);
column_name {= | <>} {@PRESENT | @ABSENT}

El siguiente ejemplo devuelve todos los registros cuando la columna amount es superior a 10 000 y no provoca que un registro se deseche cuando amount está ausente.

WHERE (amount = @PRESENT AND amount > 10000)

Comparación de Valores de Columna

Para asegurarse de que los elementos utilizados en una comparación coinciden, compare los tipos de columna adecuados:

Prueba de Valores NULL

Para evaluar columnas para valores NULL, utilice la siguiente sintaxis.

column {= | <>} @NULL

A continuación, se devuelve TRUE si el valor de columna es NULL y, por lo tanto, replica la fila. Devuelve FALSE para todos los demás casos (incluida una columna que falta en el registro).

WHERE (amount = @NULL)

Lo siguiente devuelve TRUE solo si la columna está presente en el registro y no es NULL.

WHERE (amount = @PRESENT AND amount <> @NULL)

Nota: Si un valor de la pista contiene más de 4000 bytes, la función @NULL devolverá TRUE.

Recuperación de Valores Antes y Después

Para las operaciones de actualización y supresión, puede ser útil recuperar los valores BEFORE de las columnas de origen (los valores anteriores a la actualización). Para las inserciones, todos los valores de columna se consideran imágenes AFTER.

Estos valores se almacenan en la pista y se pueden utilizar en filtros y asignaciones de columnas. Por ejemplo, puede:

Para hacer referencia al valor anterior

  1. Utilice la función de conversión de columna @BEFORE con el nombre de la columna para la que desea un valor anterior, de la siguiente forma:

    @BEFORE (column_name)

  2. Utilice el parámetro GETUPDATEBEFORES del archivo de parámetros Extract para capturar imágenes anteriores del registro de transacción o utilícelo en el archivo de parámetros Replicat para utilizar la imagen anterior en un filtro o asignación de columnas. Si utiliza la función Resolución y detección de conflictos (CDR), puede utilizar la opción GETBEFORECOLS de TABLE. Para utilizar estos parámetros, todas las columnas deben estar presentes en el log de transacciones. Si la base de datos solo registra los valores de las columnas que han cambiado, el uso de la función @BEFORE puede dar como resultado una condición de "falta columna" y la asignación de columnas se ejecuta como si la columna no estuviera en el registro. Consulte Protección de la Disponibilidad de Datos para Filtros para asegurarse de que los valores de columna están disponibles.

    Oracle GoldenGate también proporciona la función @AFTER para recuperar los valores posteriores cuando sea necesario para el filtrado, para su uso en funciones de conversión u otros fines. Consulte @BEFORE y @AFTER en la Referencia de parámetros y funciones para Oracle GoldenGate.

Selección de Columnas

Para controlar qué columnas de una tabla de origen extrae Oracle GoldenGate, utilice las opciones COLS y COLSEXCEPT del parámetro TABLE. Utilice COLS para seleccionar columnas para la extracción y utilice COLSEXCEPT para seleccionar todas las columnas excepto las designadas por COLSEXCEPT.

Restringir las columnas que se extraen puede ser útil cuando una tabla de destino no contiene las mismas columnas que la tabla de origen, o cuando las columnas contienen información confidencial, como un número de identificación personal u otra información de negocio propia.

Selección y Conversión de Operaciones SQL

Por defecto, Oracle GoldenGate captura y aplica las operaciones INSERT, UPDATE y DELETE. Puede utilizar los siguientes parámetros en el archivo de parámetros Extract o Replicat para controlar qué tipo de operaciones se procesan, como solo inserciones o solo inserciones y actualizaciones.

GETINSERTS | IGNOREINSERTS

GETUPDATES | IGNOREUPDATES

GETDELETES | IGNOREDELETES

Puede convertir un tipo de operación SQL a otro mediante los siguientes parámetros en el archivo de parámetros Replicat:

Uso del historial de transacciones

Oracle GoldenGate permite conservar un historial de los cambios realizados en un registro de destino y asignar información sobre la operación que ha causado cada cambio. Este historial puede resultar útil para crear un sistema de generación de informes basado en transacciones que contenga un registro independiente para cada operación realizada en una tabla, en lugar de contener sólo la versión más reciente de cada registro.

Por ejemplo, la siguiente serie de operaciones realizadas en una tabla de destino denominada CUSTOMER no dejaría ningún rastreo del ID de Dave. La última operación elimina el registro, por lo que no hay manera de averiguar el historial de cuentas de Dave o su saldo final.

Tabla 6 Historial de operaciones de la tabla CLIENTE

Secuencia Operación ID BALANCE
1 Insert Dave 1000
2 Update Dave 900
3 Update Dave 1250
4 Delete Dave 1250

Mantener este historial como una serie de registros puede ser útil de muchas maneras. Por ejemplo, puede generar el efecto neto de las transacciones.

Para implantar informes de transacciones

  1. Para preparar Extract para capturar los valores anteriores, utilice el parámetro GETUPDATEBEFORES en el archivo de parámetros Extract. Un valor anterior (o anterior a la imagen) es el valor existente de una columna antes de realizar una actualización. Antes de que las imágenes permitan que Oracle GoldenGate cree el registro de transacción.

  2. Para preparar Replicat para publicar todas las operaciones como inserciones, utilice el parámetro INSERTALLRECORDS en el archivo de parámetros Replicat. Cada operación de una tabla se convierte en un nuevo registro de esa tabla.

  3. Para asignar el historial de transacciones, utilice los valores de retorno de la opción GGHEADER de la función de conversión de columna @GETENV. Incluya la función de conversión como expresión de origen en una sentencia COLMAP en el parámetro TABLE o MAP.

Mediante la serie de transacciones de ejemplo que se muestra en la Tabla 9-6, se pueden crear las siguientes configuraciones de parámetros para generar una vista más orientada a las transacciones de los clientes, en lugar del último estado de la base de datos.

Procesar Sentencias de parámetros
Extracción GETUPDATEBEFORES TABLE ACCOUNT.CUSTOMER;
Replicat INSERTALLRECORDS MAP SALES.CUSTOMER, TARGET SALES.CUSTHIST, COLMAP (TS = @GETENV ('GGHEADER', 'COMMITTIMESTAMP'), BEFORE_AFTER = @GETENV ('GGHEADER', 'BEFOREAFTERINDICATOR'), OP_TYPE = @GETENV ('GGHEADER', 'OPTYPE'), ID = ID, BALANCE = BALANCE);

Nota: Esto no representa un archivo de parámetros completo para un proceso de Oracle GoldenGate. Tenga en cuenta también que estos ejemplos representan una base de datos no sensible a mayúsculas/minúsculas.

Esta configuración permite realizar consultas como las siguientes, que devuelven la suma neta de cada transacción junto con la hora de la transacción y el ID de cliente.

SELECT AFTER.ID, AFTER.TS, AFTER.BALANCE - BEFORE.BALANCE
FROM CUSTHIST AFTER, CUSTHIST BEFORE
WHERE AFTER.ID = BEFORE.ID AND AFTER.TS = BEFORE.TS AND
AFTER.BEFORE_AFTER = 'A' AND BEFORE.BEFORE_AFTER = 'B';