DB2 高级设置

Version 26.1.9526


DB2 高级设置


DB2 端口的 高级设置 选项卡允许配置端口的高级属性及其数据处理方法。以下部分详细介绍了以下功能和配置:

高级选项卡上的许多其他设置都是从正在使用的数据源动态加载的,因此本文档中未介绍它们。 高级选项卡 中描述了非特定于数据源的设置。

提示:可以突出显示应用程序中的任何字段以显示工具提示,其中包含有关该字段功能的更多信息。

XML 模型

DB2 端口将知行之桥中的 DB2 表建模为 XML。建模遵循以下结构:

  • 父元素标识要插入的表。
  • 每个子元素对应目标表中的一列。

这在 XML 元素和 DB2 值之间建立了连接,这允许端口从传入的 XML 文档中读取值并在 INSERT 或 UPDATE 查询中使用它们。

单击配置面板上方的 </> 代码 可以查看表的 XML 模型。以下 XML 是名为 Account 的表的简化示例模型:

<Items>
    <Account action="upsert">
        <Id key="true" />
        <account_c />
        <AccountNumber />
        <AccountSource />
    </Account>
</Items>

在上面的例子中,Idaccount_cAccountNumberAccountSource是Account表的列。当端口处理与此结构匹配的 XML 文件时,它会自动将来自该 XML 的值插入到 Account 表中。当端口查询 Account 表时,它会输出与此结构匹配的 XML。

批处理输入

DB2 端口支持批处理以提高插入大量数据时的性能。批处理通过 高级设置 部分下标记为 事务大小批处理大小 的两个字段进行配置。当这些字段设置为正整数时,端口在单个操作(批处理)中插入 [批处理大小] 记录,并在单个连接(事务)中插入 [事务大小] 记录。

XML 输入文件可以包含比单个事务大小更多的记录,在这种情况下,端口将在多个事务中插入数据

如果在批量插入过程中发生错误,端口将回滚事务并缓存失败事务中第一条记录的索引。重试输入文件时,只有缓存索引之后的记录才会插入到DB2中。

批量输出

当查询输出时,端口可以配置为支持将记录一起批量输出到单个文档中。 最大记录数 设置可用于控制单个消息中应包含多少条记录,批处理大小 设置可用于指示单个批处理组中应包含多少个批处理消息。

子表

DB2 端口支持使用单个操作更新和选择多个表。创建具有多个表的表模型时,这些表之间应该有外键关系,表示一个表是另一个表的子表。

要与子表交互,首先创建一个以父表为目标的模型。然后使用 +添加 按钮从配置面板中添加子表。从表列表中选择子表,设计器将自动填充表的层次结构,然后选择应包含在模型中的子表的列。

子表 XML

插入父表和子表时,输入映射 XML 结构将是多层的。以下 XML 是通过外键关联的两个表的示例输入映射:

<Account action="upsert">
    <Id key="true" />
    <account_c />
    <AccountNumber />
    <AccountSource />
    <AccountPartner>
        <Id key="true" />
        <AccountFromId ref="@Id" />
        <IsPrimary />
        <OpportunityId />
        <Role />
    </AccountPartner>
</Account>

在上面的例子中,Account 是父表,AccountPartner 是子表。当 DB2 端口处理匹配此结构的输入 XML 文件时,它会更新 AccountAccountPartner 表并确保链接两条记录的键相同。

使用 ref 属性

子表中的某些列标有蓝色 REF 标记。此标记表示这些列对应于父表中的主键。在对父表进行插入之后,在对子表进行插入之前,端口会在父表中查询它刚刚插入的记录的主键。然后,端口在插入子表时使用此值。

当父表的主键由 DB2 生成时,这很有用。在这种情况下,此列不会作为输入 XML 传入,因此端口在将记录插入到父表中之前不知道该列的值。.

在 XML 模型中,ref 属性表示可以稍后引用列,或者应该从映射中的另一列读取列的值。为了引用由 DB2 生成的列的值,列元素应包含一个 ref 属性,该属性设置为保留值 LAST_INSERT_ID

<Item action="upsert">
    <Id key="true" upsert="id" ref="@@LAST_INSERT_ID" />

这表明 id 值将在插入后检索,并且可以在以后引用(通常在子表中)。要稍后引用此值,请将 ref 元素设置为相关列的名称:

<id key="true" ref="@id" />

在上面的例子中,id_是父表中主键的名称,也是子表中某列的名称。 ref 语法指示端口在插入后从父表中检索 _id,然后将检索到的值用作子表中的 id 列。

从子表中查找

通常,当从父表和子表中选择时,如果外键与父表中的主键匹配,则应仅从子表中提取记录。

例如,假设一个 Select 从父表 PurchaseOrders 和子表 PurchaseOrderLineItems 中提取采购订单数据。从 PurchaseOrders 拉取的每条记录(订单)还应拉取与该订单关联的行项目。这两个表通过共享列关联,例如 PONumber 列是 PurchaseOrders 表的主键和 PurchaseOrdersLineItems 表中的外键。如果订单项的 PONumber 与从父表中提取的订单的 PONumber 匹配,则应仅从子表中提取订单项记录。

要在知行之桥中建立这种关系,请向 Select 添加一个新过滤器并按如下方式配置它:

  • 在第一个(左侧)下拉列表中,选择作为父表外键的子表列。在上面的示例中,这将是 PurchaseOrderLineItems 表的 PONumber 列。
  • 在中间(运算符)下拉列表中,选择 equal
  • 在最后一个(右侧)输入框中,首先使用右侧的下拉箭头选择 REF。之后,输入框应该有$前缀,表示正在引用父表
  • 使用最后一个(右侧)下拉列表选择应与子表的外键匹配的父表列。在上面的示例中,这将是 PurchaseOrders 表的 PONumber 列。

只处理新的或更改的记录

可以将选择操作配置为仅检索最近更新或添加的记录。端口可以使用两种方法来检测哪些记录是新的或被修改的。

  • 第一种方法需要一个 DateTime 列来表示记录的最后修改时间
  • 第二种方法需要一个列来显式存储一个值,该值表示是否应该处理记录。

这两个选项均在配置面板底部的 高级 设置中的 设置 选项卡上设置。要进一步细化您的要求,请参阅 高级 选项卡的 高级设置 部分中的三个附加 流程更改… 设置。

使用最后修改的列

在配置面板底部找到 高级设置 设置。如果检测到 DateTime 列,则选项显示为 使用列处理新的记录或已更改的记录。将此设置为表示记录的上次修改时间的相应 DateTime 列。

使用自定义列

可以配置选择操作来更新从 DB2 表中成功拉取记录的列。这可以与过滤规则结合使用,该规则会仅选择列的值指示尚未拉取(或应再次拉取)的记录。

要在处理后启用列更新,请在映射编辑器底部找到 高级设置 设置。启用在成功处理行时使用值更新列,然后指定应该更新哪一列以及应该在该列中设置的值。

例如,输出映射可能配置为在提取记录后将 Processed 列更新为 1。然后,可以应用 Filter 规则,将记录限制为 Processed 不等于 1 的记录。

在此示例中,当端口处理查询模板时,它会根据模板创建一个 SELECT 语句。该模板将执行“SELECT Id、AccountId、Amount FROM INVOICE”,根据模板为结果集中的每条记录创建一个 XML 文件,并将这些文件放置在此端口的输出文件夹中。

预处理和后处理查询

你可以配置 DB2 端口以在执行其配置的操作之前和之后执行其他查询。 可以通过手动修改端口生成的查询代码来配置这些附加查询。 以下部分概述了此过程。

在 UPSERT 映射

在 UPSERT 映射,在所有记录被 UPSERT 插入表之前或之后,可以自动发生的查询。

如要配置此功能,首先点击在 Upsert 配置 上的 </> Code

打开的文本编辑器允许编辑数据表映射的高级功能。文本可能如下所示:

<Items>
    <Names table="`dbo`.`Names`" action="upsert">
        <ID key="true" />
        <Name /></Names>
</Items>

如要在任何数据插入表之前触发请求,定义一个节点有如下属性:

  • requireInput 设置为 false。这是让端口不再要求必须有输入与其对应。
  • insertQuery 这包含了 UPSERT 请求之前要执行的语句。
  • table(可选)- 设置为要使用额外查询定位的表的名称。(在下面的示例中,表名称是 updateTable。)如果在映射的根级别发出查询(即,作为 <Items> 元素的子元素),此属性不是必需的。 如果将查询作为另一个表的子项发出,设置表属性可确保查询与该表的列区分开来。

根据你的需要,将这个元素放在前面或者后面即可。

在下面的例子中,<runFirst> 会在运行任何 UPSERT 之前运行 EXEC [dbo.FlushTemp]

<Items>
    <runFirst table="updateTable" insertQuery="EXEC [dbo].[FlushTemp]" requireInput="false" />
    <Names table="`dbo`.`Names`" action="upsert">
        <ID key="true" />
        <Name /></Names>
</Items>

在下面例子中,<runLast> 会在运行所有 UPSERT 之后运行 EXEC [dbo.FlushTemp]

<Items>
    <Names table="`dbo`.`Names`" action="upsert">
        <ID key="true" />
        <Name /></Names>
    <runLast table="updateTable" insertQuery="EXEC [dbo].[CommitTemp]" requireInput="false" />
</Items>

例子中的元素名称(runFirstrunLast)都是占位符,你可以随意自选。

注意:在 UPSERT 映射中的预处理和后处理查询不接受任何输入文件中的值,并且他们也不会有输出。

在 SELECT 映射中

在 SELECT 映射,在所有记录被 SELECT 插入表之前或之后,可以自动发生的查询。如要配置此功能,首先点击在 Select 配置 上的 </> Code

打开的文本编辑器允许编辑数据表映射的高级功能。如要在任何数据插入表之前触发请求,定义一个节点有如下属性:

  • requireInput 设置为 false。这是让端口不再要求必须有输入与其对应。
  • selectQuery 这包含了 SELECT 请求之前要执行的语句。
  • table(可选)- 设置为要使用额外查询定位的表的名称。 (在下面的示例中,表名称是 selectTable。)如果在映射的根级别发出查询(即,作为 <Items> 元素的子元素), 此属性不是必需的。 如果将查询作为另一个表的子项发出,设置表属性可确保查询与该表的列区分开来。

根据你的需要,将这个元素放在前面或者后面即可。

在下面的例子中,<runFirst> 会在运行任何 SELECT 之前运行 EXEC [dbo].[prepTable]

<Items>
    <runFirst table="selectTable" selectQuery="EXEC [dbo].[prepTable]" outputResult="false" />
    <Names table="`dbo`.`Names`" action="select">
        <ID key="true" />
        <Name /></Names>
</Items>

在下面例子中,<runLast> 会在运行所有 SELECT 之后运行 EXEC [dbo].[cleanTable]

<Items>
    <Names table="`dbo`.`Names`" action="select">
        <ID key="true" />
        <Name /></Names>
    <runLast table="selectTable" selectQuery="EXEC [dbo].[cleanTable]" outputResult="false" />
</Items>

例子中的元素名称(runFirstrunLast)都是占位符,你可以随意自选。

注意: SELECT 映射中的预处理和后处理查询不接受查询中未硬编码的输入元素。

XML 属性

知行之桥支持一系列 XML 属性,用于定义 XML 文档与数据库表之间数据的解析、映射和转换方式。这些属性可以应用于不同层级——如整体 XML 结构、特定表或单个列——以精确控制知行之桥读取、写入和格式化数据库数据的方式。

表属性

表属性定义了知行之桥如何与数据库表交互,指定要检索的数据、如何插入或更新记录,以及是否仅处理变更的行。诸如 selectQueryinsertQueryupsertQuerytable 等属性控制数据的检索和修改操作,而 requireInputoutputResultprocessChangesOnly 等设置则决定了输入需求和输出行为。

allColumns

在选择(Select)映射中,使用此属性指定输出 XML 应包含查询结果中返回的所有列。这允许定义输出映射,而无需在输出映射中显式定义所有列的名称。如果不使用此属性,输出映射中存在的列将用于按照代码视图中指定的顺序对查询返回的元素进行定位,查询中返回但输出映射中没有匹配列的元素将不会返回到输出 XML 中。

<MyTable allcolumns="true" selectQuery="SELECT * FROM [MyTable]" />

insertQuery

在更新/插入(Upsert)映射中,当插入记录时,可以使用此查询覆盖端口创建的默认查询。它可以用于发布超出与输入文件关联的普通插入操作之外的查询。

<runFirst insertQuery="TRUNCATE TABLE [dbo].[Records]" requireInput="false" />

outputResult

在选择(Select)映射中,如果设置此属性,则会发出匹配 Select 查询的查询,但不会生成要在输出 XML 中返回的内容。这允许运行作为事务一部分的其他查询,而这些查询不会反映在端口的输出中。

<runFirst table="selectTable" selectQuery="EXEC [dbo].[prepTable]" outputResult="false" />

processChangesOnly

在选择(Select)映射中,如果将 processChangesOnly 属性应用于表,并结合将 timeCheck 属性应用于日期时间列,则选择映射会在查询中动态生成的 WHERE 子句中使用此列,以确保仅检索新记录。这对应于设计器中 使用列 columnname 处理新记录或更改记录 选项中所选的列。有关更多信息,请参阅 仅处理新记录或更改记录

注意:此属性仅适用于选择映射中的根表。

<Orders processChangesOnly="true">

requireInput

在更新/插入(Upsert)映射中,如果设置此属性,则无论输入 XML 是否包含匹配元素,都会执行与 inputQuery 匹配的查询。当预处理或后处理查询作为存在一个或多个输入元素的同一事务的一部分发布时(例如,在输入新批次之前截断表,或在批次完成后运行存储过程),将使用此属性。

<runFirst insertQuery="TRUNCATE TABLE [dbo].[Records]" requireInput="false" />

selectQuery

在选择(Select)映射中,此属性用于在 XML 中定义查询及其参数。如果未提供 selectQuery,则会发出简单的 SELECT *。可以将 selectQuery 用于自定义查询,例如使用 JOIN 或其他 SQL 关键字的查询。

<Orders selectQuery="SELECT ID, OrderNo, OrderDate FROM Orders">

table

用于指定作为映射查询目标的表,特别是当表名与映射到它的有效 XML 元素名称不同时。

注意:如果在 selectQuery、upsertQuery 或 insertQuery 中编写了显式查询,则此属性将被忽略。

<Purchase_Orders table="Purchase Orders">

upsertQuery

在更新/插入(Upsert)映射中,使用此查询来确定正在处理的记录是新记录(INSERT)还是正在更新的现有记录(UPDATE)。操作将根据是否找到此查询的匹配结果来确定。

<Records action="upsert" upsertQuery="SELECT ID FROM Records WHERE Key1 = @Key1 and Key2 = @Key2">

列属性

列属性配置各个数据字段在知行之桥工作流中如何进行处理、转换和验证。这些属性允许定义数据类型、聚合值、跟踪随时间变化的变更,并对特定列应用自定义更新逻辑。

aggregate

在某些情况下,映射中列的值本身可能是一个 XML 聚合。默认行为是将该列视为字符串,并使用 XML 编码对列中聚合的值进行编码。但是,当列上存在 aggregate 属性时,映射到该表的 XML 文件会将任何聚合列的值作为原始 XML,而不是编码为单个元素。

<LineItems aggregate="true" />

column

映射中列上的 column 属性提供了所引用表中的列名。这可以实现以下几点:

  • 映射到非有效 XML 元素的列
  • 为数据库中的列创建别名,以将其与其他表中名称相似的列区分开来
  • 在 XML 模型中使用更易读的元素

<New_data column="New Data" />

id

在选择(Select)映射中,此属性使用 Id 标记对列值进行标记,随后可以在子查询中使用语法 ${#ID} 引用该标记。当子查询中需要列值,且多个表中的匹配列名可能导致选择歧义时,这非常有用。

    <Shipments table="`Shipments`" selectQuery="SELECT * FROM `Shipments`">
        <ID type="integer" key="true" id="ShipID"/>
        ...
        <ShipmentOrders table="`ShipmentOrders`" selectQuery="SELECT * FROM `ShipmentOrders` WHERE `ShipmentID` = ${ID}">
            <ID type="integer" key="true" id="ShipOrderID"/>
            ...
            <ShipmentOrderItems table="`ShipmentOrderItems`" selectQuery="SELECT * FROM `ShipmentOrderItems` WHERE `ShipmentOrderID` = ${ID}">
                <ID type="integer" key="true" id="ShipOrderItemID"/>
                ...

key

将该列标识为表的主键。当此属性出现在更新/插入(Upsert)查询中时,端口会在更新记录前检查该记录是否存在。如果表中没有主键属性,则仅允许对表进行插入(Insert)操作,且在选择记录后无法更新列值,因为无法标识唯一记录。(如果确定某列可以像主键列一样使用,则可以覆盖现有列作为主键。)

<ID key="true" type="integer"/>

ref

在更新/插入(Upsert)映射中,此属性用于向数据库提供无法仅从输入 XML 中确定的更新/插入值。这最常用于父子关系中以确定数据库生成的主键,或者用于一个表引用子表上的外键。有关更多信息,请参阅 使用 ref 属性

   <Orders table="`Orders`" action="upsert">
        <ID type="integer" key="true" ref="@@LAST_INSERT_ID" />
        ...
        <OrderLines table="`OrderLines`" action="upsert">
            <ID type="integer" key="true" />
            ...
            <OrderID type="integer" ref="@ID" />
        </OrderLines>
    </Orders>

timeCheck

在选择(Select)映射中,如果将 processChangesOnly 属性应用于表,并结合将 timeCheck 属性应用于日期时间列,则选择映射会在查询中动态生成的 WHERE 子句中使用此列,以确保仅检索新记录。这对应于设计器中 使用列 columnname 处理新记录或更改记录 选项中所选的列。有关更多信息,请参阅 仅处理新记录或更改记录

注意:此属性仅适用于选择映射中的根表。

<LastModified timeCheck="true" />

type

用于标识表中列的数据类型。对于更新/插入(Upsert)查询,在执行查询之前,系统会根据该类型对列中的值进行验证。

<ID key="true" type="integer"/>

updateValue

在选择(Select)映射中,从数据库中选择的任何记录在检索后,都会使用此列中的新值进行更新。这对应于设计器中的 当行处理成功时,使用值 value 更新列 columnname 选项。

注意:此属性仅适用于查询中的根表。

<Exported updateValue="true" />