Mapear e Transformar Dados
Saiba mais sobre tarefas, funções, comandos e processos usados para integrar dados entre tabelas de origem e de destino.
Parâmetros que Controlam o Mapeamento e a Integração de Dados
Toda a seleção, mapeamento e manipulação de dados que o Oracle GoldenGate executa é realizada usando uma ou mais opções dos parâmetros TABLE e MAP.
-
Use
TABLEno arquivo de parâmetros Extract. -
Use
MAPno arquivo de parâmetros Replicat.
TABLE e MAP especificam os objetos de banco de dados que são afetados pelos outros parâmetros no arquivo de parâmetros. Consulte Especificando Nomes de Objetos na Entrada do Oracle GoldenGate para obter instruções sobre como especificar nomes de objetos nesses parâmetros.
Mapeamento entre Bancos de Dados Diferentes
O mapeamento e a conversão entre tabelas que têm estruturas de dados diferentes requerem um arquivo de definição de origem, um arquivo de definição de destino ou, em alguns casos, ambos. O mapeamento entre bancos de dados diferentes é controlado pelas trilhas de autodescrição, e o mapeamento é feito pelo nome da coluna, independentemente do tipo de dados da coluna de origem ou de destino.
Se você não quiser o mapeamento automático com base nas trilhas de autodescrição ou quiser compatibilidade com versões anteriores, poderá usar SOURCEDEFS ou TARGETDEFS.
Mapeamento e Conversão em Sistemas NonStop
Se você estiver mapeando ou convertendo dados de um sistema Windows ou UNIX para um destino do Enscribe NonStop, o mapeamento ou a conversão deverá ser executada no sistema de origem Windows ou UNIX. O Replicat para NonStop não pode converter nomes e tipos de dados de tabelas SQL de três ou duas partes nos nomes de arquivos de três partes usados para a plataforma Enscribe. O processo Extract pode formatar os dados de trilha com nomes de Enscribe e tipos de dados de destino.
Mapeamento e Conversão em Sistemas Windows e UNIX
Quando o Oracle GoldenGate está operando apenas em sistemas baseados em Windows e UNIX, o mapeamento e a conversão de colunas podem ser executados no processo Extract ou no processo Replicat. Para evitar a sobrecarga adicionada desse processamento no processo Extract, é possível configurar o mapeamento e a conversão a serem executados no processo Replicat ou em um sistema intermediário.
No caso de haver várias origens e um destino, pode ser mais eficiente executar o mapeamento e a conversão na origem.
Considerações de Globalização ao Mapear Dados
Ao planejar mapear e converter dados entre bancos de dados e plataformas, leve em consideração o que é suportado ou não pelo Oracle GoldenGate em termos de globalização.
Conversão entre Conjuntos de Caracteres
O Oracle GoldenGate converterá os conjuntos de caracteres de origem e de destino se forem diferentes, de modo que os nomes de objetos e os dados da coluna sejam comparados, mapeados e manipulados corretamente de um banco de dados para outro. Consulte Conjuntos de Caracteres Suportados, para obter uma lista de conjuntos de caracteres suportados.
Para garantir a representação precisa de caracteres de um banco de dados para outro, o seguinte deve ser verdadeiro:
-
O conjunto de caracteres do banco de dados de destino deve ser um superconjunto ou equivalente ao conjunto de caracteres do banco de dados de origem. Equivalente significa não igual, mas ter o mesmo conjunto de caracteres. Por exemplo, Shift-JIS e EUC-JP tecnicamente não são completamente iguais, mas têm os mesmos caracteres na maioria dos casos.
-
Se os aplicativos cliente usarem conjuntos de caracteres diferentes, o conjunto de caracteres do banco de dados também deverá ser um superconjunto ou equivalente aos conjuntos de caracteres dos aplicativos cliente.
-
Em muitos bancos de dados, incluindo o Oracle, é possível forçar um caractere em um banco de dados que não faça parte do Conjunto de Caracteres. O Oracle GoldenGate considera isso como um valor inválido e pode não mapear esse caractere corretamente ao replicar dados. Para esses tipos de situações, você pode usar o parâmetro
REPLACEBADCHARconforme descrito na Referência de Parâmetros e Funções do Oracle GoldenGate.
Nesta configuração, cada caractere é representado ao converter de um conjunto de caracteres de cliente ou de origem para o conjunto de caracteres do banco de dados local.
Um processo Replicat pode suportar a conversão de um conjunto de caracteres de origem para um conjunto de caracteres de destino.
Nomes de Objetos de Banco de Dados
O Oracle GoldenGate processa nomes de catálogo, esquema, tabela e coluna em seu idioma nativo, conforme determinado pela codificação do conjunto de caracteres dos bancos de dados de origem e de destino. Esse suporte preserva nomes de byte único e multibyte, símbolos, caracteres de acento e distinção entre maiúsculas e minúsculas com a configuração regional levada em consideração quando disponível, em todos os níveis da hierarquia do banco de dados.
Dados da Coluna
O Oracle GoldenGate oferece suporte à conversão de dados de coluna entre conjuntos de caracteres quando os dados estão contidos nos seguintes tipos de coluna:
-
Colunas de tipo de caractere:
CHAR/VARCHAR/CLOBaCHAR/VARCHAR/CLOBde outro conjunto de caracteres; eCHAR/VARCHAR/CLOBde e paraNCHAR/NVARCHAR/NCLOB. -
Colunas que contêm números baseados em string e dados de data e hora. As conversões dessas colunas são realizadas entre dados Z/OS EBCDIC e não-z/OS ASCII. A conversão não é realizada entre as versões ASCII e ASCII desses dados, nem entre as versões EBCDIC e EBCDIC, porque os dados são compatíveis nesses casos.
Observação: O Oracle GoldenGate suporta dados de timestamp de
0001-01-03 00:00:00para9999-12-31 23:59:59. Se um timestamp for convertido de GMT para hora local, esses limites também se aplicarão ao timestamp resultante. Um valor de mês zero, campo de dia zero ou um valor de data zero não é suportado. Por exemplo, valores como 0000-00-00 00:00:00, ou qualquer valor de data que inclua um campo de dia zero ou zero mês não é suportado.
A conversão do conjunto de caracteres para dados de coluna é limitada a um mapeamento direto de uma coluna de origem e uma coluna de destino nas cláusulas COLMAP ou USEDEFAULTS do parâmetro Replicat MAP. Um mapeamento direto é um mapeamento de nome para nome sem o uso de um procedimento armazenado ou função de conversão de coluna. O Replicat executa a conversão do conjunto de caracteres. Nenhuma conversão é executada pelo processo Extract.
Preservação da localidade
O Oracle GoldenGate leva em consideração a configuração regional do banco de dados ao comparar nomes de objetos que não fazem distinção entre maiúsculas e minúsculas. Consulte Configurações Regionais Suportadas para obter uma lista das configurações regionais suportadas.
Suporte para Sequências de Escape
O Oracle GoldenGate suporta o uso de uma sequência de escape para representar uma coluna de string, um texto literal ou um nome de objeto no arquivo de parâmetros. Você poderá usar uma sequência de escape se o sistema operacional não suportar o caractere necessário, como um caractere de controle, ou para qualquer outra finalidade que exija um caractere que não possa ser usado em um arquivo de parâmetros.
Uma sequência de escape pode ser usada em qualquer lugar do arquivo de parâmetros, mas é particularmente útil nos seguintes elementos em uma instrução TABLE ou MAP:
-
Um nome de objeto
-
Cláusula
WHERE -
Cláusula
COLMAPpara designar um caractere Unicode a uma coluna Unicode ou para designar um caractere codificado nativo a uma coluna. -
Funções de conversão de coluna do Oracle GoldenGate dentro de uma cláusula
COLMAP.
O Oracle GoldenGate suporta os seguintes tipos de sequência de escape:
-
\uFFFFSequência de escape Unicode. Qualquer ponto de códigoUNICODEpode ser usado, exceto pares substitutos. -
\377Sequência de escape octal -
\xFFSequência de escape hexadecimal
As seguintes regras são aplicáveis:
-
Se usado para o mapeamento de um nome de objeto em
TABLEouMAP, nenhuma restrição será aplicada. Por exemplo, a seguinte especificaçãoTABLEé válida:TABLE schema."\u3000ABC"; -
Se usado com uma função de mapeamento de coluna, qualquer ponto de código pode ser usado, mas somente para uma coluna
NCHAR/NVARCHAR. Para uma colunaCHAR/VARCHAR, o ponto de código é limitado ao equivalente a ASCII de 7 bits. -
Os tipos de dados de origem e destino devem ser idênticos (por exemplo,
NCHARaNCHAR). -
Comece cada sequência de escape com um solidus reverso (ponto de código
U+005C), seguido pelo ponto de código de caractere. (Um solidus é mais comumente conhecido como o símbolo de barra invertida.) Use a sequência de escape, em vez do caractere real, dentro da string de entrada na instrução de parâmetro ou na função de conversão de coluna.Observação: para especificar uma barra invertida real no arquivo de parâmetros, especifique uma barra invertida dupla. Por exemplo, o texto a seguir encontra uma barra invertida em
COL1: @STRFIND (COL1, '\' ).
Para Usar a Sequência de Escape \uFFFF Unicode
-
A sequência de escape Unicode
\uFFFFdeve começar com umuminúsculo, seguido por exatamente quatro dígitos hexadecimais. -
Os intervalos suportados são os seguintes:
-
0a9(U+0030aU+0039) -
AaF(U+0041aU+0046) -
aaf(U+0061aU+0066)
-
\u20ac é a sequência de escape Unicode para o sinal de moeda Euro.
Observação: para suporte confiável entre plataformas, use a sequência de escape Unicode. As sequências de escape octal e hexadecimal não são padronizadas em diferentes sistemas operacionais.
Para usar a sequência de escape \377 octal
-
Deve conter exatamente três dígitos octais.
-
Intervalos suportados:
-
O intervalo do primeiro dígito é de
0a3(U+0030aU+0033) -
O intervalo para segundo e terceiro dígitos é de
0a7(U+0030aU+0037)
\200é a sequência de escape octal para o sinal de moeda Euro no Microsoft Windows -
Para Usar a Eequência de Escape Hexadecimal \xFF
-
Deve começar com um
xminúsculo seguido de exatamente dois dígitos hexadecimais. -
Intervalos suportados:
-
0a9(U+0030aU+0039) -
AaF(U+0041aU+0046) -
aaf(U+0061aU+0066)
-
\x80 é a sequência de escape hexadecimal para o sinal de moeda Euro na página de código Latin1 do Microsoft Windows 1252.
Mapeando Colunas Usando TABLE e MAP
O Oracle GoldenGate fornece mapeamento de colunas no nível da tabela e no nível global. O mapeamento de coluna padrão também é fornecido na ausência de regras de mapeamento de coluna explícitas.
Esta seção contém as seguintes diretrizes para colunas de mapeamento:
Suportando Maiúsculas/Minúsculas e Caracteres Especiais em Nomes de Colunas
Por padrão, o Oracle GoldenGate segue as regras SQL-92 para especificar nomes de coluna e literais. Nos arquivos de parâmetros, nas funções de conversão, nas saídas do usuário e nos comandos do Oracle GoldenGate, os nomes de colunas com distinção entre maiúsculas e minúsculas deverão estar entre aspas duplas se o banco de dados exigir que o banco de dados faça distinção entre maiúsculas e minúsculas. Para outros bancos de dados com distinção entre maiúsculas e minúsculas que não exigem aspas, os nomes de colunas com distinção entre maiúsculas e minúsculas devem ser especificados à medida que são armazenados no banco de dados. Os literais devem estar entre aspas simples. Consulte Diferenciando Nomes de Colunas com Distinção entre Maiúsculas e Minúsculas de Literais para obter mais informações.
Configurando o Mapeamento de Colunas no Nível da Tabela com COLMAP
Se você estiver usando trilhas de autodescrição, qualquer coluna no objeto de origem será mapeada para o mesmo nome de coluna no objeto de destino. Você só precisa gerenciar nomes de coluna diferentes entre origem e destino ou se precisar transformar uma coluna.
No entanto, se não estiver usando trilhas de autodescrição, o mapeamento padrão será feito por ordem de coluna e não pelo nome da coluna. Portanto, a coluna 1 na origem será mapeada para a coluna 1 no destino, a coluna 2 para a coluna 2 e assim por diante.
Use a opção COLMAP dos parâmetros MAP e TABLE para:
-
mapear colunas de origem individuais para colunas de destino que tenham nomes diferentes.
-
especifique o mapeamento de coluna padrão quando um mapeamento de coluna explícito não for necessário.
-
Forneça instruções para selecionar, mapear, traduzir e mover dados de uma coluna de origem para uma coluna de destino.
Usando USEDEFAULTS para Ativar o Mapeamento de Colunas Padrão
Você pode usar a opção USEDEFAULTS de COLMAP para especificar o mapeamento de coluna padrão automático para qualquer coluna de origem e destino correspondente que tenha nomes idênticos. O USEDEFAULTS pode economizar tempo eliminando a necessidade de mapear cada coluna de destino explicitamente.
O mapeamento padrão faz com que o Oracle GoldenGate mapeie essas colunas e, se necessário, traduza os tipos de dados com base no arquivo de definições de dados. Não especifique o mapeamento padrão para colunas já mapeadas com uma instrução de mapeamento explícita.
O exemplo a seguir de um mapeamento de coluna ilustra o uso do mapeamento de coluna default e explícito para uma tabela de origem ACCTBL e uma tabela de destino ACCTTAB. A maioria das colunas é a mesma em ambas as tabelas, exceto para as seguintes diferenças:
-
A tabela de origem tem uma coluna
CUST_NAME, enquanto a tabela de destino tem uma colunaNAME. -
Uma coluna
PHONE_NOde dez dígitos na tabela de origem corresponde a colunasAREA_CODE,PHONE_PREFIXePHONE_NUMBERseparadas na tabela de destino. -
As colunas separadas
YY, MMeDDna tabela de origem correspondem a uma única colunaTRANSACTION_DATEna tabela de destino.
Para resolver essas diferenças, USEDEFAULTS é usado para mapear as colunas semelhantes automaticamente, enquanto as funções explícitas de mapeamento e conversão são usadas para colunas diferentes.
A amostra a seguir mostra o mapeamento de colunas usando a opção COLMAP dos parâmetros MAP e TABLE. Ele descreve o mapeamento da tabela de origem ACCTBL para a tabela 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)
)
;
Exemplo de Mapeamento de Coluna da Tabela 3
| Instrução de parâmetro | Descrição |
|---|---|
COLMAP |
Inicia a instrução COLMAP. |
USEDEFAULTS, |
Mapeia colunas de origem como estão quando os nomes de coluna de destino são idênticos. |
NAME = CUST_NAME, |
Mapeia a coluna de origem CUST_NAME para a coluna de destino NAME. |
TRANSACTION_DATE = @DATE ('YYYY-MM-DD', 'YY', YEAR, 'MM', MONTH, 'DD', DAY), |
Converte a data da transação das colunas de data de origem para a coluna de destino TRANSACTION_DATE usando a função de conversão da coluna @DATE. |
AREA_CODE = @STREXT (PHONE_NO, 1, 3), PHONE_PREFIX = @STREXT (PHONE_NO, 4, 6), PHONE_NUMBER = @STREXT (PHONE_NO, 7, 10)) ; |
Converte a coluna de origem PHONE_NO nas colunas de destino separadas de AREA_CODE, PHONE_PREFIX e PHONE_NUMBER usando a função de conversão de coluna @STREXT. |
Consulte Noções Básicas sobre o Mapeamento de Colunas Padrão para obter mais informações sobre as regras seguidas pelo Oracle GoldenGate para mapeamento de colunas padrão.
Especificando as Colunas a Serem Mapeadas na Cláusula COLMAP
A sintaxe COLMAP é a seguinte:
COLMAP ([USEDEFAULTS, ] target_column = source_expression)
Nesta sintaxe, target_column é o nome da coluna de destino e source_expression. Alguns exemplos de source_expressions são:
-
O nome de uma coluna de origem, como
ORD_DATE. -
Constante numérica, como
123. -
Constante de string entre aspas simples, como
'ABCD'. -
Uma expressão que usa uma função de conversão de coluna do Oracle GoldenGate. Em uma instrução
COLMAP, você pode usar qualquer uma das funções de conversão de colunas do Oracle GoldenGate para transformar dados das colunas mapeadas, por exemplo:@STREXT (COL1, 1, 3) -
Veja um exemplo de como usar
BEFORE column_name:BEFORE ORD_DATE -
Veja um exemplo de como usar
AFTER column_name:AFTER ORD_DATE. Esta é a opção padrão se um nome de coluna for listado.
Se o mapeamento de colunas envolver colunas com distinção entre maiúsculas e minúsculas de diferentes tipos de banco de dados, especifique cada coluna conforme ela é armazenada no banco de dados.
-
Se o banco de dados exigir aspas duplas para impor a distinção entre maiúsculas e minúsculas, especifique o nome da coluna com distinção entre maiúsculas e minúsculas entre aspas duplas.
-
Se o banco de dados fizer distinção entre maiúsculas e minúsculas sem exigir aspas duplas, especifique o nome da coluna conforme ela é armazenada no banco de dados.
A seguir, é mostrado um mapeamento entre uma coluna de destino em um Oracle AI Database e uma coluna de origem em um banco de dados SQL Server com distinção entre maiúsculas e minúsculas.
COLMAP ("ColA" = ColA)
Consulte Especificando Nomes de Objetos na Entrada do Oracle GoldenGate para obter mais informações sobre como especificar nomes para o Oracle GoldenGate.
Consulte Considerações sobre Globalização ao Mapear Dados para obter considerações sobre globalização ao mapear colunas de origem e destino em bancos de dados que têm diferentes conjuntos de caracteres e configurações regionais.
Evite usar COLMAP para mapear um valor para uma coluna de chave (o que faz com que a operação se torne uma atualização de chave primária). A cláusula WHERE que o Oracle GoldenGate usa para localizar a linha de destino não usará a imagem correta antes da coluna de chave. Em vez disso, ele usará a imagem posterior. Isso causará erros se você estiver usando qualquer função baseada nessa coluna de chave, como uma instrução SQLEXEC.
Limitações de Mapeamento de Coluna
Veja a seguir as limitações de mapeamento de colunas:
-
As colunas
LOBnão podem ser usadas em colunasFILTER,WHEREou como umasource_expressionem uma instruçãoCOLMAP. As colunasLOBsãoBLOB,CLOB,NCLOB,XMLType, Tipos de Dados Definidos pelo Usuário, Tabelas Aninhadas,VARRAYse outros tipos de dados especiais. -
Se a coluna de origem contiver mais de 4000 bytes, ela não poderá ser usada em rotinas de transformação, pois o valor será armazenado na trilha como um registro
LOB. Por exemplo, umVARCHAR2(4000 CHAR) no Oracle e o conjunto de caracteres japonês são armazenados como 3 bytes para cada caractere. Isso implica que a coluna pode ter 12000 bytes de comprimento e que o Oracle GoldenGate armazenaria esse valor como um campoLOB. -
A instrução SQL completa que o Oracle GoldenGate executaria excederia 4 MB de tamanho. Por exemplo, se você tiver uma tabela com milhares de colunas
VARCHAR2(4000)e quiser colocar 4000 bytes em cada uma, isso poderá fazer com que a instrução SQL total que o Oracle GoldenGate executará exceda o tamanho máximo de 4 MB.
Configurando o Mapeamento de Colunas Globais com COLMATCH
Use o parâmetro COLMATCH para criar regras globais para mapeamento de coluna. Com COLMATCH, você pode mapear entre tabelas estruturadas de forma semelhante que tenham nomes de coluna diferentes para os mesmos conjuntos de dados. COLMATCH fornece uma maneira mais conveniente de mapear colunas desse tipo do que usar o mapeamento no nível da tabela com uma cláusula COLMAP em instruções TABLE ou MAP individuais.
A distinção entre maiúsculas e minúsculas é suportada da seguinte forma:
-
Para MySQL, SQL Server se o banco de dados fizer distinção entre maiúsculas e minúsculas,
COLMATCHprocurará uma correspondência exata de maiúsculas e minúsculas e nomes, independentemente de um nome estar ou não especificado entre aspas. -
Para bancos de dados Oracle AI Database e Db2, em que os nomes podem diferenciar maiúsculas de minúsculas ou não diferenciar maiúsculas de minúsculas no mesmo banco de dados e aspas duplas são necessárias para mostrar distinção entre maiúsculas e minúsculas,
COLMATCHrequer uma correspondência exata de maiúsculas e minúsculas e nomes quando um nome está entre aspas no banco de dados.
Sintaxe
COLMATCH
{NAMES target_column = source_column |
PREFIX prefix |
SUFFIX suffix |
RESET}
| Argumento | Descrição |
|---|---|
NAMES target_column = source_column |
Mapas baseados em nomes de colunas. Coloque aspas duplas ao redor do nome da coluna se ela fizer distinção entre maiúsculas e minúsculas e o banco de dados exigir aspas para impor a distinção entre maiúsculas e minúsculas. Para esses tipos de banco de dados, o Oracle GoldenGate não faz distinção entre maiúsculas e minúsculas em um nome de coluna sem aspas. Para bancos de dados que suportam distinção entre maiúsculas e minúsculas sem exigir aspas, especifique o nome da coluna conforme ela é armazenada no banco de dados. Se o COLMATCH estiver entre colunas em diferentes tipos de banco de dados, certifique-se de que os nomes reflitam a representação de maiúsculas e minúsculas apropriada para cada uma. Por exemplo, o seguinte especifica um nome de coluna de destino com distinção entre maiúsculas e minúsculas "aBc" em um Oracle AI Database e um nome de coluna de origem com distinção entre maiúsculas e minúsculas aBc em um banco de dados SQL Server com distinção entre maiúsculas e minúsculas: COLMATCH NAMES "aBc" = aBc. |
PREFIX prefix / SUFFIX suffix |
Ignora o prefixo ou sufixo de nome especificado. Coloque aspas duplas ao redor do prefixo ou sufixo se o banco de dados exigir aspas para impor a distinção entre maiúsculas e minúsculas, por exemplo, "P_". Para esses tipos de banco de dados, um prefixo ou sufixo sem aspas é tratado sem distinção entre maiúsculas e minúsculas. Para bancos de dados que suportam distinção entre maiúsculas e minúsculas sem exigir aspas, especifique o prefixo ou o sufixo à medida que ele é armazenado no banco de dados. Por exemplo, "P_" especifica um prefixo P maiúsculo. O exemplo a seguir especifica um prefixo sem distinção entre maiúsculas e minúsculas a ser ignorado: COLMATCH PREFIX p_. O nome da coluna de destino P_ABC é mapeado para o nome da coluna de origem ABC e o nome da coluna de destino P_abc é mapeado para o nome da coluna de origem abc. O exemplo a seguir especifica um sufixo com distinção entre maiúsculas e minúsculas a ser ignorado: SUFFIX "_k". O nome da coluna de destino ABC_k é mapeado para o nome da coluna de origem ABC e o nome da coluna de destino "abc_k" é mapeado para o nome da coluna de origem abc. |
RESET |
Desativa as regras COLMATCH definidas anteriormente para as instruções TABLE ou MAP subsequentes. |
O exemplo a seguir ilustra quando usar COLMATCH. As tabelas de origem e de destino são idênticas, exceto para o banco de dados names.The de tabela e coluna ligeiramente diferentes, sem distinção entre maiúsculas e minúsculas.
| Tabela ACCT | Tabela ORD |
|---|---|
CUST_CODE CUST_NAME CUST_ADDR PHONE S_REP S_REPCODE |
CUST_CODE CUST_NAME ORDER_ID ORDER_AMT S_REP S_REPCODE |
| Tabela ACCOUNT | Tabela ORDER |
|---|---|
CUSTOMER_CODE CUSTOMER_NAME CUSTOMER_ADDRESS PHONE REP REPCODE |
CUSTOMER_CODE CUSTOMER_NAME ORDER_ID ORDER_AMT REP REPCODE |
Para mapear as colunas de origem para as colunas de destino neste exemplo, bem como para tratar os mapas subsequentes de outras tabelas, a sintaxe é:
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;
Com base nas regras do exemplo, ocorre o seguinte:
-
Os dados são mapeados das colunas
CUST_CODEnas tabelas de origemACCTeORDpara as colunasCUSTOMER_CODEnas tabelasACCOUNTeORDERde destino. -
O prefixo
S_será ignorado. -
As colunas com os mesmos nomes, como as colunas
PHONEeORDER_AMT, são mapeadas automaticamente por meio deUSEDEFAULTSsem exigir regras explícitas. Consulte Noções Básicas Sobre o Mapeamento de Colunas Padrão para obter mais informações. -
O mapeamento de coluna global anterior está desativado para as tabelas
REGePRICE. As colunas de origem e destino nessas tabelas são mapeadas automaticamente porque todos os nomes são idênticos.
Noções Básicas Sobre o Mapeamento de Colunas Padrão
Para trilhas de autodescrição, se não existir um mapeamento de coluna explícito, usando COLMATCH ou COLMAP, o Oracle GoldenGate mapeia as colunas de origem e destino por padrão de acordo com as regras a seguir.
Isso não se aplicará se você estiver usando SOURCEDEFS ou TARGETDEFS.
-
Se for encontrada uma coluna de origem cujo nome e maiúsculas e minúsculas correspondam exatamente aos da coluna de destino, os dois serão mapeados.
-
Se nenhuma correspondência de maiúsculas e minúsculas for encontrada, o mapeamento de nomes de fallback será usado. O mapeamento de fallback executa um mapeamento de tabela de destino sem distinção entre maiúsculas e minúsculas para localizar uma correspondência de nome. A correspondência de nome de coluna inexata é aplicada usando nomes com maiúsculas e minúsculas. Esse comportamento é controlado pelo parâmetro
GLOBALSNAMEMATCHIGNORECASE. Você pode desativar a correspondência de nomes de fallback com o parâmetroNAMEMATCHEXACTou pode mantê-lo ativado, mas com uma mensagem de advertência usando o parâmetroNAMEMATCHNOWARNING. -
As colunas de destino que não correspondem a nenhuma coluna de origem recebem valores padrão determinados pelo banco de dados.
Se o mapeamento padrão não puder ser executado, a coluna de destino assumirá como padrão um dos valores mostrados na tabela a seguir.
| Tipo de Coluna | Valor |
|---|---|
| Numérico | Zero (0) |
Caractere ou VARCHAR |
Espaços |
| Data ou Data/Hora | Data e hora atual |
Colunas que podem assumir um valor NULL |
Nulo |
Conversões de Tipo de Dados
Saiba como o Oracle GoldenGate mapeia tipos de dados.
Colunas Numéricas
As colunas numéricas são convertidas para corresponder ao tipo e à escala da coluna de destino. Se a escala da coluna de destino for menor que a da origem, o número será truncado à direita. Se a escala da coluna de destino for maior que a da origem, o número será preenchido com zeros à direita.
Você pode especificar um valor de substituição para dados numéricos inválidos encontrados durante o mapeamento de colunas de número usando o parâmetro REPLACEBADNUM para obter mais informações.
Colunas de tipo de caractere
As colunas de tipo de caractere podem aceitar tipos de dados baseados em caracteres, como VARCHAR, numérico na forma de string, data e hora na forma de string e literais de string. Se a escala da coluna de destino for menor que a da origem, a coluna será truncada à direita. Se a escala da coluna de destino for maior que a da origem, a coluna será preenchida com espaços à direita.
Os literais devem estar entre aspas simples.
Você pode controlar a resposta do processo do Oracle GoldenGate quando não existir um ponto de código válido para o conjunto de caracteres de origem ou de destino ao mapear colunas de caracteres usando o parâmetro REPLACEBADCHAR para obter mais informações.
Colunas de Data/Hora
As colunas Datetime (DATE, TIME e TIMESTAMP) podem aceitar colunas datetime e character, bem como literais de string. Os literais devem estar entre aspas simples. Para mapear uma coluna de caracteres para uma coluna de data e hora, certifique-se de que ela esteja em conformidade com o formato SQL externo do Oracle GoldenGate de YYYY-MM-DD HH:MI:SS.FFFFFF.
O Oracle GoldenGate suporta dados de timestamp de 0001-01-03 00:00:00 para 9999-12-31 23:59:59. Se um timestamp for convertido de GMT para hora local, esses limites também se aplicarão ao timestamp resultante. Dependendo do fuso horário, a conversão pode adicionar ou subtrair horas, o que pode fazer com que o timestamp exceda o limite inferior ou superior suportado.
A precisão necessária varia de acordo com o tipo de dados e a plataforma de destino. Se a escala da coluna de destino for menor que a da origem, os dados serão truncados à direita. Se a escala da coluna de destino for maior que a da origem, a coluna será estendida à direita com os valores para a data e hora atuais.
Selecionando e Filtrando Linhas
A filtragem só pode ser executada em colunas disponíveis para o Oracle GoldenGate. No Extract TRANLOG, o Oracle GoldenGate tem acesso a todas as colunas presentes nos redo logs e no banco de dados. Se as colunas não estiverem nos redo logs, elas deverão ser extraídas explicitamente (usando FETCHCOLS) para poder filtrá-las. Na bomba Extract e no processo Replicat, as colunas devem estar disponíveis no arquivo de trilha. Por isso, qualquer coluna que você queira usar em uma cláusula FILTER ou WHERE deve ser explicitamente registrada usando ADD TRANDATA COLS e você deve manter o padrão LOGALLSUPCOLS.
Para filtrar ou selecionar linhas para extração ou replicação, use as cláusulas FILTER e WHERE dos parâmetros TABLE e MAP.
A cláusula FILTER oferece mais funcionalidade do que a cláusula WHERE porque você pode empregar qualquer uma das funções de conversão de coluna do Oracle GoldenGate, enquanto a cláusula WHERE aceita operadores WHERE básicos.
Selecionando Linhas com uma Cláusula FILTER
Use uma cláusula FILTER para selecionar linhas com base em um valor numérico usando operadores básicos ou uma ou mais funções de conversão de coluna do Oracle GoldenGate.
Observação: Para filtrar uma coluna com base em uma string, use uma das funções de string do Oracle GoldenGate ou use uma cláusula WHERE.
A sintaxe de FILTER em uma instrução TABLE é a seguinte:
TABLE source_table
, FILTER (
[, ON INSERT | ON UPDATE| ON DELETE]
[, IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE]
, filter_clause);
A sintaxe de FILTER em uma instrução MAP é a seguinte e inclui uma opção de tratamento de erros.
MAP source_table, TARGET target_table,
, FILTER (
[, ON INSERT | ON UPDATE| ON DELETE]
[, IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE]
[, RAISEERROR error_number]
, filter_clause);
Os elementos da cláusula FILTER válidos são:
-
Uma função de conversão de colunas do Oracle GoldenGate. Essas funções são incorporadas ao Oracle GoldenGate para que você possa executar testes, manipular dados, recuperar valores etc. Consulte Como Testar e Transformar Dados para obter mais informações sobre as funções de conversão do Oracle GoldenGate.
-
Números
-
Colunas que contêm números
-
Funções que retornam números
-
Operadores aritméticos:
-
+(mais) -
-(menos) -
*(multiplicar) -
/(dividir) -
%(remainder)
-
-
Operadores de comparação:
-
>(maior que) -
>=(maior que ou igual) -
<(menos que) -
<=(menor que ou igual) -
=(igual) -
<>(diferente) -
Os resultados derivados de comparações podem ser zero (indicando
FALSE) ou diferente de zero (indicandoTRUE).
-
-
Parênteses (para agrupar resultados na expressão)
-
Operadores de conjunção:
AND,OR
Use as opções FILTER a seguir para especificar quais operações SQL uma cláusula de filtro afeta. Qualquer uma dessas opções pode ser combinada.
ON INSERT | ON UPDATE | ON DELETE IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE
Use a opção RAISEERROR de FILTER no parâmetro MAP para gerar um erro definido pelo usuário quando o filtro falhar. Essa opção é útil quando você precisa acionar um evento em resposta à falha.
Use a função @RANGE em uma cláusula FILTER para distribuir a carga de trabalho de processamento entre várias instruções MAP ou TABLE.
Veja um exemplo:
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'
)
;
Tabela 4 Usando Várias Instruções FILTER
| Arquivo de parâmetros | Descrição |
|---|---|
REPERROR (9999, EXCEPTION) |
Gera uma exceção para o erro especificado. |
MAP OWNER.SRCTAB, TARGET OWNER.TARGTAB, |
Inicia a instrução MAP. |
SQLEXEC (ID CHECK, ON UPDATE, QUERY ' SELECT COUNT FROM TARGTAB ' 'WHERE PKCOL = :P1 ', PARAMS (P1 = PKCOL)), |
Executa uma consulta para recuperar o valor presente da coluna COUNT sempre que uma atualização é encontrada. Há uma opção BEFOREFILTER que também permite que a consulta ou o procedimento armazenado seja executado antes do processamento da cláusula FILTER. Isso permite que valores da parte SQLEXEC sejam usados dentro do FILTER no runtime. |
FILTER (BALANCE > 15000), |
Usa uma cláusula FILTER para selecionar linhas em que o saldo é maior que 15000. |
FILTER (ON UPDATE, @BEFORE (COUNT) = CHECK.COUNT) |
Usa outra cláusula FILTER para garantir que o valor da coluna COUNT de origem antes de uma atualização corresponda ao valor na coluna de destino antes de aplicar a atualização de destino. |
; |
O ponto e vírgula conclui a instrução MAP. |
MAP OWNER.SRCTAB, TARGET OWNER.TARGEXC, EXCEPTIONSONLY, COLMAP (USEDEFAULTS, ERRTYPE = 'UPDATE FILTER FAILED'); |
Designa uma instrução MAP de exceções. A cláusula REPERROR para o erro 9999 garante que as exceções mapeadas para TARGEXC sejam executadas. |
Exemplo 9-5 Chamando a Função @COMPUTE
O exemplo a seguir chama a função @COMPUTE para extrair registros em que o preço multiplicado pelo valor excede 10.000.
MAP SALES.TCUSTORD, TARGET SALES.TORD,
FILTER (@COMPUTE (PRODUCT_PRICE * PRODUCT_AMOUNT) > 10000);
Exemplo 9-6 Chamando a Função @STREQ
O seguinte usa a função @STREQ para extrair registros em que o valor de uma coluna de caracteres é 'JOE'.
TABLE ACCT.TCUSTORD, FILTER (@STREQ ("Name", 'joe') > 0);
Exemplo 9-7 Selecionando Registros
O item a seguir seleciona registros nos quais a coluna AMOUNT é maior que 50 e executa o filtro nas operações UPDATE e DELETE.
TABLE ACT.TCUSTORD, FILTER (ON UPDATE, ON DELETE, AMOUNT > 50);
Exemplo 9-8 Usando a Função @RANGE
(arquivo de parâmetros Replicat group 1)
MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (1, 2, ID));
(Arquivo de parâmetros do grupo 2 de replicação)
MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (2, 2, ID));
Você pode combinar várias cláusulas FILTER em uma instrução MAP ou TABLE, conforme mostrado na Tabela 9-4, que mostra parte de um arquivo de parâmetros de Replicat. O Oracle GoldenGate executa os filtros na ordem listada, até que um deles falhe ou até que todos sejam transmitidos. Se um filtro falhar, todos falharão.
Selecionando Linhas com uma Cláusula WHERE
Use qualquer um dos elementos na Tabela 9-5 em uma cláusula WHERE para selecionar ou excluir linhas (ou ambas) com base em uma instrução condicional. Cada cláusula WHERE deve estar entre parênteses. Os literais devem estar entre aspas simples.
Tabela 5 Operadores WHERE Permissíveis
| Elemento | Exemplos |
|---|---|
| Nomes de colunas | PRODUCT_AMT |
| Valores numéricos | -123, 5500.123 |
| Strings literais | 'AUTO', 'Ca' |
| Testes de coluna incorporados | @NULL, @PRESENT, @ABSENT (a coluna é nula, presente ou ausente na linha). Esses testes são incorporados ao Oracle GoldenGate. Consulte Considerações para Selecionar Linhas com FILTER e WHERE. |
| Operador de comparação | =, <>, >, <, >=, <= |
| Operadores conjuntivos | AND, OR |
| Parênteses de agrupamento | Use parênteses de abertura e fechamento ( ) para agrupamento lógico de vários elementos. |
O Oracle GoldenGate não suporta FILTER para colunas que tenham um conjunto de caracteres de vários bytes ou um conjunto de caracteres incompatível com o conjunto de caracteres do sistema operacional local.
Os operadores aritméticos e os tipos de dados de ponto flutuante não são suportados pelo WHERE. Para usar condições de seleção mais complexas, use a cláusula FILTER ou uma rotina de saída do usuário.
A sintaxe para WHERE é idêntica nas instruções TABLE e MAP:
TABLE table, WHERE (clause);
MAP source_table, TARGET target_table, WHERE (clause);
Considerações sobre a Seleção de Linhas com FILTER e WHERE
As sugestões a seguir podem ajudá-lo a criar uma cláusula de seleção bem-sucedida. Observação: Os exemplos nesta seção pressupõem um banco de dados sem distinção entre maiúsculas e minúsculas.
Garantindo a Disponibilidade de Dados para Filtros
Se o banco de dados registrar apenas valores de colunas alteradas no log de transações, poderá haver erros se qualquer uma das colunas inalteradas for referenciada pelos critérios de seleção. O Oracle GoldenGate ignora essas operações de linha, as envia para o arquivo de descarte e emite uma advertência.
Para evitar erros de coluna ausente, crie as condições de seleção da seguinte forma:
-
Use apenas colunas de chave primária como critério de seleção, se possível.
-
Disponibilize os valores de coluna necessários ativando o registro em log complementar para essas colunas. Como alternativa, você pode usar a opção
FETCHCOLSouFETCHCOLSEXCEPTdo parâmetroTABLE. Essas opções são válidas para todos os bancos de dados suportados. Eles consultam o banco de dados para extrair os valores se eles não estiverem presentes no log. Para recuperar os valores antes de a cláusulaFILTERouWHEREser executada, inclua a opçãoFETCHBEFOREFILTERna instruçãoTABLEantes da cláusulaFILTERouWHERE. Por exemplo:
TABLE DEMO.PEOPLE, FETCHBEFOREFILTER, FETCHCOLS (age), FILTER (age > 50);
- Teste primeiro a presença de uma coluna e depois o valor da coluna. Para testar a presença de uma coluna, use a sintaxe a seguir.
column_name {= | <>} {@PRESENT | @ABSENT}
O exemplo a seguir retorna todos os registros quando a coluna amount tem mais de 10.000 e não faz com que um registro seja descartado quando a coluna amount estiver ausente.
WHERE (amount = @PRESENT AND amount > 10000)
Comparando Valores de Colunas
Para garantir que os elementos usados em uma comparação correspondam, compare os tipos de coluna apropriados:
-
Colunas de caracteres para strings literais.
-
Colunas numéricas para valores numéricos, que podem incluir um sinal e um ponto decimal.
-
Colunas de data e hora para strings literais, usando o formato no qual a coluna é recuperada pelo aplicativo.
Testando Valores Nulos
Para avaliar colunas para valores NULL, use a sintaxe a seguir.
column {= | <>} @NULL
A seguir, retornará TRUE se o valor da coluna for NULL e, assim, replicará a linha. Ele retorna FALSE para todos os outros casos (incluindo uma coluna ausente no registro).
WHERE (amount = @NULL)
A seguir, retorna TRUE somente se a coluna estiver presente no registro e não for NULL.
WHERE (amount = @PRESENT AND amount <> @NULL)
Observação: Se um valor na trilha contiver mais de 4000 bytes, a função @NULL retornará TRUE.
Recuperando Valores Antes e Depois
Para operações de atualização e exclusão, pode ser útil recuperar os valores BEFORE das colunas de origem (os valores antes da atualização ocorrer). Para inserções, todos os valores de coluna são considerados imagens AFTER.
Esses valores são armazenados na trilha e podem ser usados em filtros e mapeamentos de coluna. Por exemplo, é possível:
-
Recupere a imagem anterior de uma linha como parte de uma especificação de mapeamento de coluna em uma instrução
MAPde exceções e mapeie esses valores para uma tabela de exceções para uso no teste ou na solução de problemas de rotinas de resolução de conflitos. -
Executar cálculos delta. Por exemplo, se uma tabela tiver uma coluna
Balance, você poderá calcular o resultado líquido de uma determinada transação subtraindo o saldo original do novo saldo, como no exemplo a seguir:MAP "owner"."src", TARGET "owner"."targ", COLMAP (PK1 = PK1, delta = balance - @BEFORE (balance));Observação: O exemplo anterior indica um banco de dados com distinção entre maiúsculas e minúsculas, como o Oracle. Os nomes de tabela estão entre aspas para refletir a diferenciação entre maiúsculas e minúsculas.
Para Fazer Referência ao Valor Anterior
-
Use a função de conversão de coluna
@BEFOREcom o nome da coluna cujo valor anterior você deseja, da seguinte forma:@BEFORE (column_name) -
Use o parâmetro
GETUPDATEBEFORESno arquivo de parâmetros Extract para capturar imagens antes do registro de transação ou use-o no arquivo de parâmetros Replicat para usar a imagem anterior em um mapeamento ou filtro de coluna. Se você estiver usando o recurso CDR (Conflict Resolution and Detection), poderá usar a opçãoGETBEFORECOLSdeTABLE. Para usar esses parâmetros, todas as colunas devem estar presentes no log de transações. Se o banco de dados registrar apenas os valores das colunas que foram alteradas, o uso da função@BEFOREpoderá resultar em uma condição "coluna ausente" e o mapa de colunas será executado como se a coluna não estivesse no registro. Consulte Garantindo a Disponibilidade de Dados para Filtros para garantir que os valores da coluna estejam disponíveis.O Oracle GoldenGate também fornece a função
@AFTERa ser recuperada após valores quando necessário para filtragem, para uso em funções de conversão ou outras finalidades. Consulte@BEFOREe@AFTERna Referência de Parâmetros e Funções do Oracle GoldenGate.
Selecionando Colunas
Para controlar quais colunas de uma tabela de origem são extraídas pelo Oracle GoldenGate, use as opções COLS e COLSEXCEPT do parâmetro TABLE. Use COLS para selecionar colunas para extração e use COLSEXCEPT para selecionar todas as colunas, exceto as designadas por COLSEXCEPT.
A restrição das colunas que são extraídas pode ser útil quando uma tabela de destino não contém as mesmas colunas da tabela de origem ou quando as colunas contêm informações confidenciais, como um número de identificação pessoal ou outras informações comerciais proprietárias.
Selecionando e Convertendo Operações SQL
Por padrão, o Oracle GoldenGate captura e aplica operações INSERT, UPDATE e DELETE. Você pode usar os parâmetros a seguir no arquivo de parâmetros Extract ou Replicat para controlar quais tipos de operações são processados, como somente inserções ou somente inserções e atualizações.
GETINSERTS | IGNOREINSERTS
GETUPDATES | IGNOREUPDATES
GETDELETES | IGNOREDELETES
Você pode converter um tipo de operação SQL em outro usando os seguintes parâmetros no arquivo de parâmetros Replicat:
-
Use
INSERTUPDATESpara converter operações de atualização de origem para inserções na tabela de destino. Isso é útil para manter um histórico de transações nessa tabela. O registro de log de transações deve conter todos os valores de coluna da tabela, não apenas os valores alterados. Alguns bancos de dados não registram valores de linha completa em seu log de transações, mas apenas valores que foram alterados. -
Use
INSERTDELETESpara converter todas as operações de exclusão de origem para inserções na tabela de destino. Isso é útil para manter um histórico de todos os registros que estiveram no banco de dados de origem. -
Use
UPDATEDELETESpara converter exclusões de origem em atualizações no destino.
Usando o Histórico de Transações
O Oracle GoldenGate permite manter um histórico de alterações feitas em um registro de destino e mapear informações sobre a operação que causou cada alteração. Esse histórico pode ser útil para criar um sistema de relatórios baseado em transação que contenha um registro separado para cada operação executada em uma tabela, em vez de conter apenas a versão mais recente de cada registro.
Por exemplo, a série de operações a seguir feitas em uma tabela de destino chamada CUSTOMER não deixaria nenhum rastreamento do ID de Dave. A última operação exclui o registro, então não há como descobrir o histórico da conta de Dave ou seu saldo final.
Tabela 6 - Histórico de Operação da Tabela CUSTOMER
| Sequência | Operação | ID | BALANCE |
|---|---|---|---|
1 |
Insert |
Dave |
1000 |
2 |
Update |
Dave |
900 |
3 |
Update |
Dave |
1250 |
4 |
Delete |
Dave |
1250 |
Manter esse histórico como uma série de registros pode ser útil de várias maneiras. Por exemplo, você pode gerar o efeito líquido das transações.
Para Implementar o Relatório de Transações
-
Para preparar o Extract para capturar valores anteriores, use o parâmetro
GETUPDATEBEFORESno arquivo de parâmetros do Extract. Um valor anterior (ou anterior à imagem) é o valor existente de uma coluna antes de uma atualização ser executada. Antes de as imagens permitirem que o Oracle GoldenGate crie o registro da transação. -
Para preparar o Replicat para publicar todas as operações como inserções, use o parâmetro
INSERTALLRECORDSno arquivo de parâmetros do Replicat. Cada operação em uma tabela se torna um novo registro nessa tabela. -
Para mapear o histórico de transações, use os valores de retorno da opção
GGHEADERda função de conversão da coluna@GETENV. Inclua a função de conversão como expressão de origem em uma instruçãoCOLMAPno parâmetroTABLEouMAP.
Usando a série de amostras de transações mostrada na Tabela 9-6, as configurações de parâmetro a seguir podem ser criadas para gerar uma view mais orientada a transações dos clientes, em vez do estado mais recente do banco de dados.
| Processo | Instruções de parâmetro |
|---|---|
| Extrair | 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); |
Observação: não representa um arquivo de parâmetros completo para um processo do Oracle GoldenGate. Observe também que esses exemplos representam um banco de dados sem distinção entre maiúsculas e minúsculas.
Essa configuração possibilita consultas como a seguinte, que retorna a soma líquida de cada transação juntamente com o tempo da transação e o ID do 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';