本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用转换规则表达式定义列内容
要定义新列和现有列的内容,可以在转换规则中使用表达式。例如,使用表达式,您可以添加列或将源表标头复制到目标。您还可以使用表达式将目标表上的记录标记为在源中插入、更新或删除。
使用表达式添加列
要使用转换规则中的表达式向表添加列,请使用 add-column
规则操作和 column
规则目标。
以下示例将新列添加到 ITEM
表中。它将新列名称设置为 FULL_NAME
,数据类型为 string
,长度为 50 个字符。此表达式连接两个现有列 LAST_NAME
和 FIRST_NAME
的值,以便计算结果为 FULL_NAME
。schema-name
、table-name
和表达式参数引用的是源数据库表中的对象。Value
和 data-type
块引用的是目标数据库表中的对象。
{ "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 } } ] }
使用表达式标记目标记录
要将目标表中的记录标记为在源表中插入、更新或删除,请在转换规则中使用表达式。表达式使用 operation_indicator
函数来标记记录。从源中删除的记录不会从目标中删除。而是使用用户提供的值标记目标记录,以指示该记录已从源中删除。
注意
operation_indicator
函数仅适用于源数据库和目标数据库中具有主键的表。
例如,以下转换规则首先将新的 Operation
列添加到目标表中。然后,只要从源表中删除记录,它就会更新具有值 D
的列。
{ "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 } }
使用表达式复制源表标头
默认情况下,源表的标头不会复制到目标。要指示要复制哪些标头,请将转换规则与包含表列标头的表达式结合使用。
您可以在表达式中使用以下列标头。
标题 | 正在进行的复制中的值 | 完全加载中的值 | 数据类型 |
---|---|---|---|
AR_H_STREAM_POSITION | 来自源的流位置值。此值可能是系统更改号(SCN)或日志序列号(LSN),具体取决于源端点。 | 空字符串。 | string |
AR_H_TIMESTAMP | 指示更改时间的时间戳。 | 指示数据到达目标的当前时间的时间戳。 | DATETIME(小数位数 = 7) |
AR_H_COMMIT_TIMESTAMP | 指示提交时间的时间戳。 | 指示当前时间的时间戳。 | DATETIME(小数位数 = 7) |
AR_H_OPERATION | INSERT、UPDATE 或 DELETE | INSERT | string |
AR_H_USER | 源提供的有关进行更改的用户的用户名、ID 或任何其他信息。 此标头仅在 SQL Server 和 Oracle(版本 11.2.0.3 及更高版本)源端点上受到支持。 |
要应用于对象的转换。转换规则操作区分大小写。 | string |
AR_H_CHANGE_SEQ | 源数据库中唯一的递增数字,由时间戳和自动递增数字组成。该值取决于源数据库系统。 | 空字符串。 | string |
以下示例通过使用源中的流位置值向目标添加新列。对于 SQL Server,流位置值是源端点的 LSN。对于 Oracle,流位置值是源端点的 SCN。
{ "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 } }
以下示例向目标添加了一个新列,该列具有来自源的唯一递增数字。此值表示任务级别的 35 位唯一数字。前 16 位数字是时间戳的一部分,后 19 位是由 DBMS 递增的 record_id 数字。
{ "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 } }
使用 SQLite 函数构建表达式
您可以使用表设置指定要应用于指定操作的选定表或视图的任何设置。表设置规则是可选的。
注意
MongoDB 和 DocumentDB 数据库没有表和视图的概念,而是将数据记录存储为文档,这些文档聚集在集合中。因此,从 MongoDB 或 DocumentDB 源迁移时,对于所选集合(而不是表和视图),请考虑范围分段类型的并行加载设置。
接下来,您可以找到可用于构建转换规则表达式的字符串函数。
字符串函数 | 描述 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
如果省略 |
trim( |
|
接下来,您可以找到可用于构建转换规则表达式的 LOB 函数。
LOB 函数 | 描述 |
---|---|
|
|
|
|
|
|
接下来,您可以找到可用于构建转换规则表达式的数字函数。
数字函数 | 描述 |
---|---|
|
|
|
|
|
|
|
多参数
|
|
多参数
|
接下来,您可以找到可用于构建转换规则表达式的 NULL 校验函数。
NULL 校验函数 | 描述 |
---|---|
|
|
|
|
|
如果参数不同,则
|
接下来,您可以找到可用于构建转换规则表达式的日期和时间函数。
日期和时间函数 | 描述 |
---|---|
|
|
|
|
|
|
|
|
|
|
接下来,您可以找到可用于构建转换规则表达式的哈希函数。
哈希函数 | 描述 |
---|---|
|
要在表达式中使用 |
使用 CASE 表达式
SQLite CASE
表达式计算条件列表,并根据结果返回一个表达式。语法如下所示。
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
示例
例 使用 case 条件向目标表添加新的字符串列
以下示例转换规则将新的字符串列 emp_seniority
添加到目标表 employee
。该示例对工资列运用 SQLite round
函数,并采用 case 条件检查工资是否等于或超过 20,000。如果条件满足,则该列获得值 SENIOR
,而其他任何列获得值 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 } }
例 向目标表添加新的日期列
以下示例将新的日期列 createdate
添加到目标表 employee
。如果使用 SQLite 日期函数 datetime
,则对于插入的每一行,都会将日期添加到新创建的表中。
{ "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 } }
例 向目标表添加新的数字列
以下示例将新的数字列 rounded_emp_salary
添加到目标表 employee
。该示例使用 SQLite round
函数添加四舍五入后的工资。
{ "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" } }
例 使用哈希函数向目标表添加新的字符串列
以下示例将新的字符串列 hashed_emp_number
添加到目标表 employee
。SQLite hash_sha256(
函数在目标上为源列 x
)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 } }
使用表达式向目标表添加元数据
可以使用以下表达式,将元数据信息添加到目标表:
-
$AR_M_SOURCE_SCHEMA
– 源架构的名称。 -
$AR_M_SOURCE_TABLE_NAME
– 源表的名称。 -
$AR_M_SOURCE_COLUMN_NAME
– 源表中的列的名称。 -
$AR_M_SOURCE_COLUMN_DATATYPE
– 源表中列的数据类型。
例 使用源的架构名称为架构名称添加列
以下示例使用源的架构名称,将名为 schema_name
的新列添加到目标。
{ "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 } }