本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用转换规则表达式定义列内容
要定义新列和现有列的内容,可以在转换规则中使用表达式。例如,使用表达式,您可以添加列或将源表标头复制到目标。您还可以使用表达式将目标表上的记录标记为在源中插入、更新或删除。
使用表达式添加列
要使用转换规则中的表达式向表添加列,请使用 add-column
规则操作和 column
规则目标。
以下示例将新列添加到 ITEM
表中。它将新列名称设置为 FULL_NAME
,数据类型为 string
,长度为 50 个字符。此表达式连接两个现有列 LAST_NAME
和 FIRST_NAME
的值,以便计算结果为 FULL_NAME
。的schema-name
,table-name
,而表达式参数是指源数据库表中的对象。Value
还有data-type
block 引用目标数据库表中的对象。
{ "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
function 仅适用于源数据库和目标数据库上均有主键的表。
例如,以下转换规则首先将新的 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 | 指示更改时间的时间戳。 | 一个时间戳,表示当前数据到达目标的时间。 | 日期时间(比例=7) |
AR_H_COMMIT_TIMESTAMP | 指示提交时间的时间戳。 | 指示当前时间的时间戳。 | 日期时间(比例=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 校验函数。
空值校验函数 | 描述 |
---|---|
|
的 |
|
的 |
|
的 的 |
接下来,您可以找到可用于构建转换规则表达式的日期和时间函数。
日期和时间函数 | 描述 |
---|---|
|
的 |
|
的 |
|
的 |
|
的 |
|
的
|
接下来,你可以找到一个哈希函数,你可以用它来构建转换规则表达式。
哈希函数 | 描述 |
---|---|
|
的 要使用 |
使用 CASE 表达式
SQLiteCASE
expression 计算条件列表并根据结果返回表达式。语法如下所示。
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
示例
例 使用大小写条件向目标表添加新的字符串列
以下示例转换规则添加了一个新的字符串列,emp_seniority
,到目标表,employee
。它使用 SQLiteround
薪金列上的函数,并以案例条件检查工资是否等于或超过 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
。它使用 SQLiteround
函数将四舍五入的工资相加。
{ "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
。SQLitehash_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 } }