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.
-
Utilice
TABLEen el archivo de parámetros Extract. -
Utilice
MAPen el archivo de parámetros Replicat.
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:
-
El juego de caracteres de la base de datos destino debe ser un superjuego o equivalente al juego de caracteres de la base de datos origen. Equivalente significa que no es igual, pero que tiene el mismo conjunto de caracteres. Por ejemplo, Shift-JIS y EUC-JP técnicamente no son completamente iguales, pero tienen los mismos caracteres en la mayoría de los casos.
-
Si las aplicaciones cliente utilizan distintos juegos de caracteres, el juego de caracteres de la base de datos también debe ser un superjuego o equivalente de los juegos de caracteres de las aplicaciones cliente.
-
En muchas bases de datos, incluida Oracle, es posible forzar un carácter a una base de datos que no forma parte del juego de caracteres. Oracle GoldenGate considera que este valor no es válido y puede que no asigne este carácter correctamente al replicar datos. Para estos tipos de situaciones, puede utilizar el parámetro
REPLACEBADCHARcomo se describe en la Referencia de parámetros y funciones para Oracle GoldenGate.
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:
-
Columnas de tipo de carácter:
CHAR/VARCHAR/CLOBaCHAR/VARCHAR/CLOBde otro juego de caracteres; yCHAR/VARCHAR/CLOBa y desdeNCHAR/NVARCHAR/NCLOB. -
Columnas que contienen números basados en cadena y datos de fecha y hora. Las conversiones de estas columnas se realizan entre los datos de z/OS EBCDIC y no z/OS ASCII. La conversión no se realiza entre las versiones ASCII y ASCII de estos datos, ni entre las versiones EBCDIC y EBCDIC, porque los datos son compatibles en estos casos.
Nota: Oracle GoldenGate soporta datos de registro de hora de
0001-01-03 00:00:00a9999-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. No se admite un valor de mes cero, campo de día cero o valor de fecha cero total. Por ejemplo, no se admiten valores como 0000-00-00 00:00:00 o cualquier valor de fecha que incluya un campo de mes cero o de día cero.
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:
-
Un nombre de objeto
-
Cláusula
WHERE -
Cláusula
COLMAPpara asignar un carácter Unicode a una columna Unicode o para asignar un carácter de codificación nativa a una columna. -
Funciones de conversión de columnas de Oracle GoldenGate en una cláusula
COLMAP.
Oracle GoldenGate soporta los siguientes tipos de secuencia de escape:
-
\uFFFFSecuencia de escape Unicode. Cualquier punto de códigoUNICODEse puede utilizar excepto los pares de sustitución. -
\377Secuencia de escape octal -
\xFFSecuencia de escape hexadecimal
Se aplica la siguiente regla:
-
Si se utiliza para la asignación de un nombre de objeto en
TABLEoMAP, no se aplica ninguna restricción. Por ejemplo, la siguiente especificaciónTABLEes válida:TABLE schema."\u3000ABC"; -
Si se utiliza con una función de asignación de columnas, se puede utilizar cualquier punto de código, pero solo para una columna
NCHAR/NVARCHAR. Para una columnaCHAR/VARCHAR, el punto de código está limitado al equivalente de ASCII de 7 bits. -
Los tipos de dato de origen y destino deben ser idénticos (por ejemplo, de
NCHARaNCHAR). -
Comience cada secuencia de escape con un solidus inverso (punto de código
U+005C), seguido del punto de código de carácter. (Un solidus se conoce más comúnmente como símbolo de barra invertida). Utilice la secuencia de escape, en lugar del carácter real, en la cadena de entrada de la sentencia de parámetro o la función de conversión de columna.Nota: Para especificar una barra invertida real en el archivo de parámetros, especifique una barra invertida doble. Por ejemplo, a continuación se encuentra una barra invertida en
COL1: @STRFIND (COL1, '\' ).
Para utilizar la secuencia de escape \uFFFF Unicode
-
La secuencia de escape Unicode
\uFFFFdebe comenzar con una minúsculau, seguida de exactamente cuatro dígitos hexadecimales. -
Los rangos admitidos son los siguientes:
-
De
0a9(deU+0030aU+0039) -
De
AaF(deU+0041aU+0046) -
De
aaf(deU+0061aU+0066)
-
\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
-
Debe contener exactamente tres dígitos octales.
-
Rangos soportados:
-
El rango del primer dígito es de
0a3(deU+0030aU+0033) -
El rango de segundo y tercer dígitos es de
0a7(deU+0030aU+0037)
\200es la secuencia de escape octal para el signo de moneda euro en Microsoft Windows -
Para utilizar la \xFF Hexadecimal Escape Eequence
-
Debe comenzar con una
xminúscula seguida de exactamente dos dígitos hexadecimales. -
Rangos soportados:
-
De
0a9(deU+0030aU+0039) -
De
AaF(deU+0041aU+0046) -
De
aaf(deU+0061aU+0066)
-
\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:
-
asignar columnas de origen individuales a columnas de destino que tengan nombres diferentes.
-
especificar la asignación de columnas por defecto cuando no sea necesaria una asignación de columnas explícita.
-
Proporcione instrucciones para seleccionar, asignar, traducir y mover datos de una columna de origen a una columna de destino.
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:
-
La tabla de origen tiene una columna
CUST_NAME, mientras que la tabla de destino tiene una columnaNAME. -
Una columna
PHONE_NOde diez dígitos de la tabla de origen se corresponde con columnasAREA_CODE,PHONE_PREFIXyPHONE_NUMBERindependientes de la tabla de destino. -
Las columnas
YY, MMyDDseparadas de la tabla de origen corresponden a una única columnaTRANSACTION_DATEde la tabla de destino.
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:
-
Nombre de una columna de origen, como
ORD_DATE. -
Constante numérica, como
123. -
Constante de cadena entre comillas simples, como
'ABCD'. -
Expresión que utiliza una función de conversión de columna de Oracle GoldenGate. En una sentencia
COLMAP, puede utilizar cualquiera de las funciones de conversión de columnas de Oracle GoldenGate para transformar datos para las columnas asignadas, por ejemplo:@STREXT (COL1, 1, 3) -
A continuación, se muestra un ejemplo del uso de
BEFORE column_name:BEFORE ORD_DATE -
A continuación se muestra un ejemplo del uso de
AFTER column_name:AFTER ORD_DATE. Esta es la opción predeterminada si se muestra un nombre de columna.
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.
-
Si la base de datos necesita comillas dobles para aplicar la distinción entre mayúsculas y minúsculas, especifique el nombre de columna sensible a mayúsculas y minúsculas entre comillas dobles.
-
Si la base de datos es sensible a mayúsculas/minúsculas sin necesidad de comillas dobles, especifique el nombre de 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:
-
Las columnas
LOBno se pueden utilizar en columnasFILTER,WHEREni comosource_expressionen una sentenciaCOLMAP. Las columnasLOBsonBLOB,CLOB,NCLOB,XMLType, tipos de dato definidos por el usuario, tablas anidadas,VARRAYsy otros tipos de dato especiales. -
Si la columna de origen contiene más de 4000 bytes, no se puede utilizar en rutinas de transformación, ya que el valor se almacena en la pista como un registro
LOB. Por ejemplo,VARCHAR2(4000 CHAR) en Oracle y el juego de caracteres japonés se almacena como 3 bytes para cada carácter. Esto implica que la columna podría tener una longitud de 12000 bytes y Oracle GoldenGate almacenaría este valor como un campoLOB. -
La sentencia SQL completa que ejecutaría Oracle GoldenGate superaría los 4 MB de tamaño. Por ejemplo, si tiene una tabla con miles de columnas
VARCHAR2(4000)y desea colocar 4000 bytes en cada una, esto podría hacer que la sentencia SQL total que Oracle GoldenGate va a ejecutar supere el tamaño máximo de 4 MB.
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:
-
Para MySQL, SQL Server si la base de datos es sensible a mayúsculas/minúsculas,
COLMATCHbusca una coincidencia exacta de mayúsculas/minúsculas y nombres independientemente de si se especifica o no un nombre entre comillas. -
Para las bases de datos Oracle AI Database y Db2, donde los nombres pueden ser sensibles a mayúsculas/minúsculas o no sensibles a mayúsculas/minúsculas en la misma base de datos y se necesitan comillas dobles para mostrar la sensibilidad a mayúsculas/minúsculas,
COLMATCHnecesita una coincidencia exacta de mayúsculas/minúsculas y nombres cuando un nombre está entre comillas en la base de datos.
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:
-
Los datos se asignan desde las columnas
CUST_CODEde las tablasACCTyORDde origen a las columnasCUSTOMER_CODEde las tablasACCOUNTyORDERde destino. -
Se ignorará el prefijo
S_. -
Las columnas con los mismos nombres, como las columnas
PHONEyORDER_AMT, se asignan automáticamente medianteUSEDEFAULTSsin necesidad de reglas explícitas. Consulte Descripción de la Asignación de Columnas por Defecto para obtener más información. -
La asignación de columnas globales anterior está desactivada para las tablas
REGyPRICE. Las columnas de origen y destino de esas tablas se asignan automáticamente porque todos los nombres son idénticos.
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 se encuentra una columna de origen cuyo nombre y mayúsculas y minúsculas coinciden exactamente con los de la columna de destino, se asignan los dos.
-
Si no se encuentra ninguna coincidencia de mayúsculas/minúsculas, se utiliza la asignación de nombre de reserva. La asignación de reserva realiza una asignación de tabla de destino no sensible a mayúsculas/minúsculas para buscar una coincidencia de nombre. La coincidencia de nombre de columna inexacta se aplica mediante nombres en mayúsculas. Este comportamiento está controlado por el parámetro
GLOBALSNAMEMATCHIGNORECASE. Puede desactivar la coincidencia de nombres de reserva con el parámetroNAMEMATCHEXACTo puede mantenerlo activado, pero con un mensaje de advertencia mediante el parámetroNAMEMATCHNOWARNING. -
Las columnas de destino que no corresponden a ninguna columna de origen toman valores por defecto determinados por la base de datos.
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:
-
Función de conversión de columnas de Oracle GoldenGate. Estas funciones están integradas en Oracle GoldenGate para que pueda realizar pruebas, manipular datos, recuperar valores, etc. Consulte Prueba y transformación de datos para obtener más información sobre las funciones de conversión de Oracle GoldenGate.
-
Números
-
Columnas que contienen números
-
Funciones que devuelven números
-
Operadores aritméticos:
-
+(más) -
-(menos) -
*(multiplicar) -
/(dividir) -
%(resto)
-
-
Operador de comparación:
-
>(mayor que) -
>=(mayor o igual que) -
<(menos que) -
<=(menor o igual a) -
=(igual) -
<>(no es igual) -
Los resultados derivados de las comparaciones pueden ser cero (que indica
FALSE) o distinto de cero (que indicaTRUE).
-
-
Paréntesis (para agrupar los resultados en la expresión)
-
Operadores de conjunción:
AND,OR
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:
-
Utilice solo columnas de clave primaria como criterios de selección, si es posible.
-
Haga que los valores de columna necesarios estén disponibles activando el registro complementario para esas columnas. También puede utilizar la opción
FETCHCOLSoFETCHCOLSEXCEPTdel parámetroTABLE. Estas opciones son válidas para todas las bases de datos soportadas. Consultan la base de datos para recuperar los valores si no están presentes en el log. Para recuperar los valores antes de ejecutar la cláusulaFILTERoWHERE, incluya la opciónFETCHBEFOREFILTERen la sentenciaTABLEantes de la cláusulaFILTERoWHERE. Por ejemplo:
TABLE DEMO.PEOPLE, FETCHBEFOREFILTER, FETCHCOLS (age), FILTER (age > 50);
- Pruebe primero la presencia de una columna y, a continuación, el valor de la columna. Para comprobar la presencia de una columna, utilice la siguiente sintaxis.
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:
-
Columnas de caracteres a cadenas literales.
-
Columnas numéricas a valores numéricos, que pueden incluir un signo y un punto decimal.
-
Columnas de fecha y hora a cadenas literales, utilizando el formato en el que la aplicación recupera la columna.
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:
-
Recupere la imagen anterior de una fila como parte de una especificación de asignación de columnas en una sentencia
MAPde excepciones y asigne esos valores a una tabla de excepciones para su uso en la prueba o solución de problemas de rutinas de resolución de conflictos. -
Realización de cálculos delta Por ejemplo, si una tabla tiene una columna
Balance, puede calcular el resultado neto de una transacción concreta restando el saldo original del nuevo saldo, como en el siguiente ejemplo:MAP "owner"."src", TARGET "owner"."targ", COLMAP (PK1 = PK1, delta = balance - @BEFORE (balance));Nota: El ejemplo anterior indica una base de datos sensible a mayúsculas/minúsculas, como Oracle. Los nombres de tabla aparecen entre comillas para reflejar la sensibilidad a mayúsculas y minúsculas.
Para hacer referencia al valor anterior
-
Utilice la función de conversión de columna
@BEFOREcon el nombre de la columna para la que desea un valor anterior, de la siguiente forma:@BEFORE (column_name) -
Utilice el parámetro
GETUPDATEBEFORESdel 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ónGETBEFORECOLSdeTABLE. 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@BEFOREpuede 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
@AFTERpara recuperar los valores posteriores cuando sea necesario para el filtrado, para su uso en funciones de conversión u otros fines. Consulte@BEFOREy@AFTERen 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:
-
Utilice
INSERTUPDATESpara convertir las operaciones de actualización de origen para insertarlas en la tabla de destino. Esto resulta útil para mantener un historial de transacciones en esa tabla. El registro de log de transacciones debe contener todos los valores de columna de la tabla, no solo los valores modificados. Algunas bases de datos no registran valores de fila completa en su log de transacciones, sino solo valores que han cambiado. -
Utilice
INSERTDELETESpara convertir todas las operaciones de supresión de origen para insertarlas en la tabla de destino. Esto resulta útil para conservar un historial de todos los registros que se encontraban en la base de datos origen. -
Utilice
UPDATEDELETESpara convertir las supresiones de origen en actualizaciones en el destino.
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
-
Para preparar Extract para capturar los valores anteriores, utilice el parámetro
GETUPDATEBEFORESen 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. -
Para preparar Replicat para publicar todas las operaciones como inserciones, utilice el parámetro
INSERTALLRECORDSen el archivo de parámetros Replicat. Cada operación de una tabla se convierte en un nuevo registro de esa tabla. -
Para asignar el historial de transacciones, utilice los valores de retorno de la opción
GGHEADERde la función de conversión de columna@GETENV. Incluya la función de conversión como expresión de origen en una sentenciaCOLMAPen el parámetroTABLEoMAP.
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';