使用动态构建的INSERT语句将批量数据插入流变量

时间:2017-04-06 14:02:16

标签: dynamic mule bulkinsert

我是Mule 3.7.3中数据库连接器的新手。我正在尝试使用动态形成的INSERT语句插入批量数据。我不知道你们通常称这种方法是什么,我打算做的是,动态地将多个文件加载到相应的临时表中,而不是在每个路由中使用多个选择路由和硬编码INSERT语句。

我的flowVars.insertStatement包含如下值:" INSERT INTO [roomService]([RoomId],[ServiceId],[DateTime])VALUES(#[payload.roomId],#[payload.serviceId], #[payload.dateTime])"

当我尝试这些时:

<db:insert config-ref="Staging_DB" doc:name="insert-data-into-staging-db" bulkMode="true">
    <db:parameterized-query><![CDATA[#[flowVars.insertStatement]]]></db:parameterized-query>

这给了我&#34;查询类型必须是&#39; [INSERT,STORE_PROCEDURE_CALL]&#39;但是DDL&#39; (java.lang.IllegalArgumentException异常)&#34;

<db:insert config-ref="Staging_DB" doc:name="insert-data-into-staging-db" bulkMode="true">
    <db:dynamic-query><![CDATA[#[flowVars.insertStatement]]]></db:dynamic-query>

这给了我&#34;批量查询不能包含参数化的SQL查询(java.lang.IllegalArgumentException)&#34;

<db:insert config-ref="Staging_DB" doc:name="insert-data-into-staging-db" bulkMode="true">
    <db:dynamic-query><![CDATA[#[flowVars.insertStatement]]]></db:dynamic-query>

这给了我&#34;索引:0(java.lang.IndexOutOfBoundsException)&#34;

我需要一些指示如何正确地做到这一点。请指教。

1 个答案:

答案 0 :(得分:0)

我担心您的方法无法使用批量模式。

您可能会像这样定义flowVars.insertStatement

<set-variable variableName="insertStatement" value="&quot;INSERT INTO [roomService] ([RoomId],[ServiceId],[DateTime]) VALUES (#[payload.roomId],#[payload.serviceId],#[payload.dateTime])&quot;" doc:name="set insertStatement"/>

这将确保payload.roomId和其他flowVars在定义变量后不会变为null,但同时它们也不会被db:insert组件替换。

以下配置使用foreach组件而非批量模式,但适用于您的:

<set-payload doc:name="test data" value="#[[{ &quot;name&quot;: &quot;Chevon&quot; }, { &quot;name&quot;: &quot;Yevgeniy&quot; }]]"/>
<foreach doc:name="For Each">
    <set-variable variableName="sql" value="insert into TEST(name) values ('#[payload.name]')" doc:name="set sql variable"/>
    <db:insert config-ref="MySQL_Configuration" doc:name="INSERT">
        <db:dynamic-query><![CDATA[#[flowVars.sql]]]></db:dynamic-query>
    </db:insert>
</foreach>