Mule:引用子数组中的值以插入数据库

时间:2017-04-06 22:57:49

标签: mule

我的传入Payload是这样的,这是一个ArrayList

  payload :[[a3An00000009Ej6EAE, a3An00000009EjGEAU, a3An00000009EjBEAU], [45000.0, 50000.0, 12000.0]]

我的传入数据中有多个数组。

我可以将id值引用为#[message.payload.id]&把它放在插入语句中:

 <db:parameterized-query><![CDATA[INSERT INTO HDR_TABLE (ID) VALUES (#[message.payload.id])]]</db:parameterized-query>

如何在代码中引用两个单独的数组?

  <db:bulk-execute config-ref="Oracle_Configuration" doc:name="Database"><![CDATA[

INSERT INTO xxtw.XXTW_OE_CONTRACT_LINE(CONTRACT_LINE_ID,ATTRIBUTE1)VALUES(xxtw.XXTW_OE_CONTRACT_LINE_SEQ.NEXTVAL,&#39;#[payload [0] [0]]&#39;,&#39;#[payload [0] [1]]&#39)

                                                                                                           ]]></db:bulk-execute>                                                                                                  
     <!--  <foreach doc:name="For Each" collection="#[flowVars.extendedPrice]">

2 个答案:

答案 0 :(得分:1)

为了将记录列表插入数据库中的表格,我们可以使用数据库连接器属性中基本设置内的批量模式选项。通过启用此选项,我们不需要遍历列表/数组。

由于批量模式操作需要Iterable / Iterator作为输入。我们必须确保Payload是一个List。在这种情况下,如果预期结果是 id 的所有值,并且 lineID 被插入到同一个表HDR_TABLE中。然后,我们必须将它们合并为List并覆盖Payload。

<expression-component doc:name="Expression"><![CDATA[
    payload.lineID.add(payload.id);
    payload = payload.lineID;]]>
</expression-component>

如果只需要将 lineID 插入HDR_TABLE,则直接设置有效负载。

<set-payload value="#[payload.lineID]" doc:name="Set Payload"/>

最后修改查询:

<db:parameterized-query><![CDATA[INSERT INTO HDR_TABLE (ID) VALUES (#[payload])]]</db:parameterized-query>

恕我直言,编辑过的问题与原版问题略有不同。但是,为了在不循环的情况下插入数组,我们仍然使用批量模式选项(Operation = Insert,Query Type = Parameterized)。然后再添加一个步骤将有效负载合并为一个连续的n元组列表。

  1. 有效负载是一个数组数组:[[a3An00000009Ej6EAE, a3An00000009EjGEAU, a3An00000009EjBEAU], [45000.0, 50000.0, 12000.0]]。它将被数据库连接器误解,即使激活批量模式也是如此。 数据库会认为只有两条记录。由于主阵列由两个记录/数组组成。
  2. 而预期的有效载荷是包含3条记录的列表。因此,我们需要将它们合并成类似于键值对的记录。所以它会是这样的:[[a3An00000009Ej6EAE, 45000.0], [a3An00000009EjGEAU, 50000.0], [a3An00000009EjBEAU, 12000.0]]
  3. 为了产生预期的有效载荷,然后添加一个额外的变压器,设置有效载荷。使用以下表达式设置其值:#[dw('payload[0] zip payload[1]')]
  4. 最后,优化SQL查询成为:INSERT INTO tableName (col1, col2) VALUES(#[payload[0]], #[payload[1]])

答案 1 :(得分:0)

您可以将payload.lineID与分隔符拆分为','生成数组。

从该数组中,您可以使用Index实际获取值。