

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Utilizar expressões de regra de transformação para definir o conteúdo da coluna
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions"></a>

Para definir o conteúdo de colunas novas e existentes, é possível utilizar uma expressão em uma regra de transformação. Por exemplo, utilizando expressões, é possível adicionar uma coluna ou replicar cabeçalhos de tabela de origem para um destino. Também é possível utilizar expressões para sinalizar registros em tabelas de destino como inseridos, atualizados ou excluídos na origem. 

**Topics**
+ [Adicionar uma coluna utilizando uma expressão](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-adding)
+ [Sinalizar registros de destino utilizando uma expressão](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Flagging)
+ [Replicar cabeçalhos de tabela de origem utilizando expressões](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Headers)
+ [Usando SQLite funções para criar expressões](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite)
+ [Adicionar metadados a uma tabela de destino utilizando expressões](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Metadata)

## Adicionar uma coluna utilizando uma expressão
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-adding"></a>

Para adicionar colunas a tabelas utilizando uma expressão em uma regra de transformação, utilize uma ação de regra `add-column` e um destino de regra `column`.

O exemplo a seguir adiciona uma nova coluna à tabela `ITEM`. Ele define o nome da nova coluna como `FULL_NAME`, com um tipo de dados de `string`, com 50 caracteres. A expressão concatena os valores de duas colunas existentes, `FIRST_NAME` e `LAST_NAME`, para avaliar para `FULL_NAME`. Os parâmetros `schema-name` e `table-name` e de expressão se referem aos objetos na tabela do banco de dados de origem. `Value` e o bloco `data-type` se referem aos objetos na tabela do banco de dados de destino.

```
{
    "rules": [
        {
            "rule-type": "selection", 
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "add-column",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "ITEM"
            },
            "value": "FULL_NAME",
            "expression": "$FIRST_NAME||'_'||$LAST_NAME",
            "data-type": {
                 "type": "string",
                 "length": 50
            }
        }
    ]
}
```

## Sinalizar registros de destino utilizando uma expressão
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Flagging"></a>

Para sinalizar registros em tabelas de destino como inseridos, atualizados ou excluídos na tabela de origem, utilize uma expressão em uma regra de transformação. A expressão utiliza um perfil `operation_indicator` para sinalizar registros. Os registros excluídos da origem não são excluídos do destino. Em vez disso, o registro de destino é sinalizado com um valor fornecido pelo usuário para indicar que ele foi excluído da origem.

**nota**  
O perfil `operation_indicator` funciona somente em tabelas que têm uma chave primária no banco de dados de origem e de destino. 

Por exemplo, a regra de transformação a seguir primeiro adiciona uma nova coluna `Operation` à uma tabela de destino. Ela atualiza a coluna com o valor `D` sempre que um registro for excluído de uma tabela de origem.

```
{
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      },
      "rule-action": "add-column",
      "value": "Operation",
      "expression": "operation_indicator('D', 'U', 'I')",
      "data-type": {
        "type": "string",
        "length": 50
      }
}
```

## Replicar cabeçalhos de tabela de origem utilizando expressões
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Headers"></a>

Por padrão, os cabeçalhos das tabelas de origem não são replicados no destino. Para indicar quais cabeçalhos a serem replicados, utilize uma regra de transformação com uma expressão que inclua o cabeçalho da coluna da tabela. 

É possível utilizar os cabeçalhos de coluna a seguir em expressões. 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions.html)

O exemplo a seguir adiciona uma nova coluna ao destino utilizando o valor da posição do fluxo da origem. Para o SQL Server, o valor da posição do fluxo é o LSN do endpoint de origem. Para o Oracle, o valor da posição do fluxo é o SCN do endpoint de origem.

```
{
      "rule-type": "transformation",
     "rule-id": "2",
      "rule-name": "2",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      },
      "rule-action": "add-column",
      "value": "transact_id",
      "expression": "$AR_H_STREAM_POSITION",
      "data-type": {
        "type": "string",
        "length": 50
      }
    }
```

O exemplo a seguir adiciona uma nova coluna ao destino que tem um número incremental exclusivo da origem. Esse valor representa um número exclusivo de 35 dígitos no nível da tarefa. Os primeiros 16 dígitos fazem parte de um timestamp e os últimos 19 dígitos são o número de record\$1id incrementado pelo DBMS.

```
{
"rule-type": "transformation",
"rule-id": "2",
"rule-name": "2",
"rule-target": "column",
"object-locator": {
"schema-name": "%",
"table-name": "%"
},
"rule-action": "add-column",
"value": "transact_id",
"expression": "$AR_H_CHANGE_SEQ",
"data-type": {
"type": "string",
"length": 50
}
}
```

## Usando SQLite funções para criar expressões
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite"></a>

Utilize as configurações da tabela para especificar quaisquer configurações que deseja aplicar à tabela ou à visualização selecionada para uma operação especificada. As regras de configuração de tabela são opcionais. 

**nota**  
Em vez do conceito de tabelas e visualizações, os bancos de dados MongoDB e DocumentDB armazenam os registros de dados como documentos reunidos em *coleções*. Portanto, ao migrar de uma origem do MongoDB ou do DocumentDB, considere o tipo de segmentação por intervalo das configurações de carga paralela para *coleções* selecionadas, em vez de tabelas e visualizações.

**Topics**
+ [Utilizar uma expressão CASE](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.CASE)
+ [Exemplos](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.Ex)

A seguir, você encontrará perfis de string que podem ser utilizadas para criar expressões de regras de transformação.


| Funções de string | Description | 
| --- | --- | 
|  `lower(x)`  |  O perfil `lower(x)` retorna uma cópia da string *`x`* com todos os caracteres convertidos em minúsculas. O padrão, o perfil `lower` integrado funciona somente para caracteres ASCII.  | 
|  `upper(x)`  |  O perfil `upper(x)` retorna uma cópia da string *`x`* com todos os caracteres convertidos em maiúsculas. O padrão, o perfil `upper` integrado funciona somente para caracteres ASCII.  | 
|  `ltrim(x,y)`  |  O perfil `ltrim(x,y)` retorna uma string formada pela remoção de todos os caracteres que aparecem em y do lado esquerdo de x. Se não houver nenhum valor para y, `ltrim(x)` removerá os espaços do lado esquerdo de x.  | 
|  `replace(x,y,z)`  |  O perfil `replace(x,y,z)` retorna uma string formada pela substituição da string z de cada ocorrência da string y na string x.  | 
| `rtrim(x,y)` |  O perfil `rtrim(x,y)` retorna uma string formada pela remoção de todos os caracteres que aparecem em y do lado direito de x. Se não houver nenhum valor para y, `rtrim(x)` removerá os espaços do lado direito de x.  | 
| `substr(x,y,z)` |  O perfil `substr(x,y,z)` retorna uma substring da string de entrada `x` que começa com o `y`º caractere e tem *`z`* caracteres.  Se *`z`* for omitido, `substr(x,y)` retornará todos os caracteres até o final da string `x` começando com o caractere `y`º. O caractere mais à esquerda de `x` é o número 1. Se *`y`* for negativo, o primeiro caractere da substring será encontrado contando a partir da direita em vez da esquerda. Se *`z`* for negativo, os caracteres `abs(z)` anteriores ao `y`º caractere serão retornados. Se `x` for uma string, os índices de caracteres se referem aos caracteres UTF-8 reais. Se `x` for um BLOB, os índices se referirão a bytes.  | 
| trim(x,y) |  O perfil `trim(x,y)` retorna uma string formada pela remoção de todos os caracteres que aparecem em `y` do dois lados de `x`. Se não houver nenhum valor para `y`, `trim(x)` removerá os espaços dos dois lados de `x`.  | 

A seguir, é possível encontrar perfis de LOB que podem ser utilizados para criar expressões de regras de transformação.


| Perfis de LOB | Description | 
| --- | --- | 
|  `hex(x)`  |  O perfil `hex` recebe um BLOB como argumento e retorna uma versão de string hexadecimal em maiúsculas do conteúdo do BLOB.  | 
|  `randomblob (N)`  |  O perfil `randomblob(N)` retorna um BLOB de `N`-bytes que contém bytes pseudoaleatórios. Se *N* for menor que 1, um BLOB aleatório de 1 byte será retornado.   | 
|  `zeroblob(N)`  |  O perfil `zeroblob(N)` retorna um BLOB que consiste em `N` bytes de 0x00.  | 

A seguir, é possível encontrar perfis numéricos que podem ser utilizados para criar expressões de regras de transformação.


| Perfis numéricos | Description | 
| --- | --- | 
|  `abs(x)`  |  O perfil `abs(x)` retorna o valor absoluto do argumento numérico `x`. A `abs(x)` função retornará NULL se *x* for NULL. A `abs(x)` função retornará 0,0 se **x** for uma string ou BLOB que não pode ser convertida em um valor numérico.  | 
|  `random()`  |  O perfil `random` retorna um número inteiro pseudoaleatório entre -9.223.372.036.854.775.808 e \$19.223.372.036.854.775.807.  | 
|  `round (x,y)`  |  A `round (x,y)` função retorna um valor de ponto flutuante *x* arredondado para *y* dígitos à direita do ponto decimal. Se não houver valor para*y*, presume-se que seja 0.  | 
|  `max (x,y...)`  |  O perfil `max` de multiargumento retorna o argumento com o valor máximo ou retorna NULL se algum argumento for NULL.  O perfil `max` pesquisa seus argumentos da esquerda para a direita em busca de um argumento que defina um perfil de agrupamento. Se um for encontrado, ele utilizará esse perfil de agrupamento para todas as comparações de strings. Se nenhum dos argumentos para `max` definir um perfil de agrupamento, o perfil de agrupamento `BINARY` será utilizado. O perfil `max` é simples quando há dois ou mais argumentos, mas funciona como um perfil agregado se tiver um único argumento.  | 
|  `min (x,y...)`  |  O perfil `min` de multiargumento retorna o argumento com o valor mínimo.  O perfil `min` pesquisa seus argumentos da esquerda para a direita em busca de um argumento que defina um perfil de agrupamento. Se um for encontrado, ele utilizará esse perfil de agrupamento para todas as comparações de strings. Se nenhum dos argumentos para `min` definir um perfil de agrupamento, o perfil de agrupamento `BINARY` será utilizado. O perfil `min` é simples quando há dois ou mais argumentos, mas funciona como um perfil agregado se tiver um único argumento.   | 

A seguir, é possível encontrar perfis de verificação de NULL que podem ser utilizados para criar expressões de regras de transformação.


| Perfis de verificação NULL | Description | 
| --- | --- | 
|  `coalesce (x,y...)`  |  O perfil `coalesce` retorna uma cópia do primeiro argumento não NULL, mas retornará NULL se todos os argumentos forem NULL. O perfil de agrupamento tem pelo menos dois argumentos.  | 
|  `ifnull(x,y)`  |  O perfil `ifnull` retorna uma cópia do primeiro argumento não NULL, mas retornará NULL se os dois argumentos forem NULL. O perfil `ifnull` tem exatamente dois argumentos. O perfil `ifnull` é igual a `coalesce` com dois argumentos.  | 
|  `nullif(x,y)`  |  O perfil `nullif(x,y)` retornará uma cópia do primeiro argumento se os argumentos forem diferentes, mas retornará NULL se os argumentos forem iguais.  O perfil `nullif(x,y)` pesquisa seus argumentos da esquerda para a direita em busca de um argumento que defina um perfil de agrupamento. Se um for encontrado, ele utilizará esse perfil de agrupamento para todas as comparações de strings. Se nenhum dos argumentos nullif definir um perfil de agrupamento, o perfil de agrupamento `BINARY` será utilizado.  | 

A seguir, é possível encontrar perfis de data e hora que podem ser utilizados para criar expressões de regras de transformação.


| Perfis de data e hora | Description | 
| --- | --- | 
|  `date(timestring, modifier, modifier...)`  |  A `date` função retorna a data no formato YYYY-MM-DD.  | 
|  `time(timestring, modifier, modifier...)`  |  O perfil `time` retorna a hora no formato HH:MM:SS.  | 
|  `datetime(timestring, modifier, modifier...)`  |  A `datetime` função retorna a data e a hora no formato YYYY-MM-DD HH:MM:SS.  | 
|  `julianday(timestring, modifier, modifier...)`  |  O perfil `julianday` retorna o número de dias desde o meio-dia em Greenwich em 24 de novembro de 4714 a.C.  | 
|  `strftime(format, timestring, modifier, modifier...)`  |  O perfil `strftime` retorna a data de acordo com a string de formato especificada como o primeiro argumento, utilizando uma das seguintes variáveis: `%d`: dia do mês `%H`: hora 00 a 24 `%f`: \$1\$1 segundos fracionários SS.SSS `%j`: dia do ano 001 a 366 `%J`: \$1\$1 número do dia juliano `%m`: mês 1 a 12 `%M`: minuto 00 a 59 `%s`: segundos desde 1-1-1970 `%S`: segundos 00 a 59 `%w`: dia da semana 0 a 6 domingo==0 `%W`: semana do ano 00 a 53 `%Y`: ano 0000 a 9999 `%%`: %  | 

A seguir, é possível encontrar um perfil de hash que pode ser utilizado para criar expressões de regras de transformação.


| Função de hash | Description | 
| --- | --- | 
|  `hash_sha256(x)`  |  O perfil `hash` gera um valor de hash para uma coluna de entrada (utilizando o algoritmo SHA-256) e retorna o valor hexadecimal do valor de hash gerado.  Para utilizar o perfil `hash` em uma expressão, adicione `hash_sha256(x)` à expressão e substitua *`x`* pelo nome da coluna de origem.  | 

### Utilizar uma expressão CASE
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.CASE"></a>

A SQLite `CASE` expressão avalia uma lista de condições e retorna uma expressão com base no resultado. A sintaxe é mostrada a seguir.

```
    CASE case_expression
     WHEN when_expression_1 THEN result_1
     WHEN when_expression_2 THEN result_2
     ...
     [ ELSE result_else ] 
    END

# Or 

     CASE
     WHEN case_expression THEN result_1
     WHEN case_expression THEN result_2
     ...
     [ ELSE result_else ] 
    END
```

### Exemplos
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.Ex"></a>

**Example de adição de uma nova coluna de string à tabela de destino utilizando uma condição de caso**  
O seguinte exemplo de regra de transformação adiciona uma nova coluna string, `emp_seniority`, à tabela de destino, `employee`. Ele usa a SQLite `round` função na coluna de salário, com uma condição de caso para verificar se o salário é igual ou superior a 20.000. Se isso acontecer, a coluna obterá o valor `SENIOR` e qualquer outra coisa terá o valor `JUNIOR`.  

```
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "public",
        "table-name": "employee"
      },
      "value": "emp_seniority",
      "expression": " CASE WHEN round($emp_salary)>=20000 THEN ‘SENIOR’ ELSE ‘JUNIOR’ END",
      "data-type": {
        "type": "string",
        "length": 50
      }

  }
```

**Example de adição de uma nova coluna string à tabela de destino utilizando função SUBSTR**  
O exemplo de regra de transformação a seguir adiciona uma nova coluna de string usando SQLite operadores ou funções para definir os dados em uma coluna. Essa abordagem envolve o uso de SQLite funções para transformar os dados GUID carregados do formato Oracle para o formato UUID antes de inseri-los na tabela de destino do Postgresql.  
A regra a seguir usa as funções SQLite substring (SUBSTR), função hexadecimal (HEX) e minúsculas (LOWER) para dividir os dados do GUID em vários grupos separados por hífens, especificamente um grupo de 8 dígitos seguido por três grupos de 4 dígitos seguidos por um grupo de 12 dígitos, totalizando 32 dígitos representando os 128 bits.  
Veja o abaixo o exemplo de dados de origem e saída no pós-processamento de destino por meio da regra de transformação:  
**Tabela de origem (formato GUID do Oracle)**    
T\$1 COL2  

```
06F6949D234911EE80670242AC120002
1A2B3C4D5E6F11EE80670242AC120003
F5E4D3C2B1A011EE80670242AC120004
```
**Tabela de destino (formato UUID do PostgreSQL)**    
T\$1 \$1TMP COL2  

```
06f6949d-2349-11ee-8067-0242ac120002
1a2b3c4d-5e6f-11ee-8067-0242ac120003
f5e4d3c2-b1a0-11ee-8067-0242ac120004
```

```
{
  "rule-type": "transformation",
  "rule-id": "2",
  "rule-name": "2",
  "rule-action": "add-column",
  "rule-target": "column",
  "object-locator": {
    "schema-name": "SPORTS",
    "table-name": "TEST_TBL_2"
  },
  "value": "t_col2_tmp",
  "expression": "CASE LOWER(SUBSTR(HEX($T_COL2), 1, 8) || '-' || SUBSTR(HEX($T_COL2), 9, 4) || '-' || SUBSTR(HEX($T_COL2), 13, 4) || '-' || SUBSTR(HEX($T_COL2), 17, 4) || '-' || SUBSTR(HEX($T_COL2), 21, 12)) WHEN '----' THEN NULL ELSE LOWER(SUBSTR(HEX($T_COL2), 1, 8) || '-' || SUBSTR(HEX($T_COL2), 9, 4) || '-' || SUBSTR(HEX($T_COL2), 13, 4) || '-' || SUBSTR(HEX($T_COL2), 17, 4) || '-' || SUBSTR(HEX($T_COL2), 21, 12)) END",
  "data-type": {
    "type": "string",
    "length": 60
  }
}
```

**Example da adição de uma nova coluna de data à tabela de destino**  
O exemplo a seguir adiciona uma nova coluna de data, `createdate`, à tabela de destino, `employee`. Quando você usa a função de SQLite data`datetime`, a data é adicionada à tabela recém-criada para cada linha inserida.  

```
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "public",
        "table-name": "employee"
      },
      "value": "createdate",
      "expression": "datetime ()",
      "data-type": {
        "type": "datetime",
        "precision": 6
      }
  }
```

**Example da adição de uma nova coluna numérica à tabela de destino**  
O exemplo a seguir adiciona uma nova coluna numérica, `rounded_emp_salary`, à tabela de destino, `employee`. Ele usa a SQLite `round` função para adicionar o salário arredondado.   

```
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "public",
        "table-name": "employee"
      },
      "value": "rounded_emp_salary",
      "expression": "round($emp_salary)",
      "data-type": {
        "type": "int8"
      }
  }
```

**Example da adição de uma nova coluna string à tabela de destino utilizando o perfil hash**  
O exemplo a seguir adiciona uma nova coluna string, `hashed_emp_number`, à tabela de destino, `employee`. A SQLite `hash_sha256(x)` função cria valores com hash no destino para a coluna de origem,`emp_number`.  

```
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "public",
        "table-name": "employee"
      },
      "value": "hashed_emp_number",
      "expression": "hash_sha256($emp_number)",
      "data-type": {
        "type": "string",
        "length": 64
      }
  }
```

## Adicionar metadados a uma tabela de destino utilizando expressões
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Metadata"></a>

É possível adicionar informações de metadados à tabela de destino utilizando as seguintes expressões:
+ `$AR_M_SOURCE_SCHEMA`: o nome do esquema de origem.
+ `$AR_M_SOURCE_TABLE_NAME`: o nome da tabela de origem.
+ `$AR_M_SOURCE_COLUMN_NAME`: o nome de uma coluna na tabela de origem.
+ `$AR_M_SOURCE_COLUMN_DATATYPE`: o tipo de dados de uma coluna na tabela de origem.

**Example da adição de uma coluna para um nome de esquema utilizando o nome do esquema da origem**  
O exemplo a seguir adiciona uma nova coluna `schema_name` ao destino utilizando o nome do esquema da origem.  

```
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      },
      "rule-action": "add-column",
      "value":"schema_name",
      "expression": "$AR_M_SOURCE_SCHEMA", 
      "data-type": { 
         "type": "string",
         "length": 50
      }
  }
```