我是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;
我需要一些指示如何正确地做到这一点。请指教。
答案 0 :(得分:0)
我担心您的方法无法使用批量模式。
您可能会像这样定义flowVars.insertStatement
:
<set-variable variableName="insertStatement" value=""INSERT INTO [roomService] ([RoomId],[ServiceId],[DateTime]) VALUES (#[payload.roomId],#[payload.serviceId],#[payload.dateTime])"" doc:name="set insertStatement"/>
这将确保payload.roomId
和其他flowVars在定义变量后不会变为null
,但同时它们也不会被db:insert
组件替换。
以下配置使用foreach
组件而非批量模式,但适用于您的:
<set-payload doc:name="test data" value="#[[{ "name": "Chevon" }, { "name": "Yevgeniy" }]]"/>
<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>