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.

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:

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:

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:

O Oracle GoldenGate suporta os seguintes tipos de sequência de escape:

As seguintes regras são aplicáveis:

Para Usar a Sequência de Escape \uFFFF Unicode

\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

Para Usar a Eequência de Escape Hexadecimal \xFF

\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:

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:

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:

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.

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:

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:

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:

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 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:

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:

TABLE DEMO.PEOPLE, FETCHBEFOREFILTER, FETCHCOLS (age), FILTER (age > 50);
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:

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:

Para Fazer Referência ao Valor Anterior

  1. Use a função de conversão de coluna @BEFORE com o nome da coluna cujo valor anterior você deseja, da seguinte forma:

    @BEFORE (column_name)

  2. Use o parâmetro GETUPDATEBEFORES no 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ção GETBEFORECOLS de TABLE. 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 @BEFORE poderá 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 @AFTER a ser recuperada após valores quando necessário para filtragem, para uso em funções de conversão ou outras finalidades. Consulte @BEFORE e @AFTER na 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:

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

  1. Para preparar o Extract para capturar valores anteriores, use o parâmetro GETUPDATEBEFORES no 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.

  2. Para preparar o Replicat para publicar todas as operações como inserções, use o parâmetro INSERTALLRECORDS no arquivo de parâmetros do Replicat. Cada operação em uma tabela se torna um novo registro nessa tabela.

  3. Para mapear o histórico de transações, use os valores de retorno da opção GGHEADER da função de conversão da coluna @GETENV. Inclua a função de conversão como expressão de origem em uma instrução COLMAP no parâmetro TABLE ou MAP.

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';