问题描述
我的有效载荷类似于以下示例
{"timezone": null,"recurrence": null,"event_id": "55bfe76n3","attendeesEmail": [
{
"email": "abc@xyz.com","responseStatus": "needsAction"
},{
"email": "efg@xyz.com","responseStatus": "needsAction"
}]
}
我想将有效负载插入到两个表中,表A中的AteeseesEmail对象中的值和表B中具有剩余的键值。我希望有一个数据库连接器来执行此操作。
我尝试过的事情:
使用批量操作插入,但无法在1个dbConnector内的单个查询中进行多次插入
BEGIN;
INSERT INTO A (event_id) values ('55bfe76n3');
INSERT INTO B (email) values ('abc@xyz.com');
COMMIT;
这将引发一条错误消息:“ 查询类型必须为'[INSERT,STORE_PROCEDURE_CALL]'之一,但必须为'DDL'(java.lang.IllegalArgumentException)。”
解决方法
这不是应该使用批量插入操作的方式。您应该使用2个非批量<db:insert>
操作,每个表一个。不要使用BEGIN和COMMIT,它们应该由Mule事务功能控制。每个操作应该是一个插入查询。
示例:
<flow name="insertFlow">
<db:insert config-ref="Mysql_Database_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[INSERT INTO A (event_id) values ('55bfe76n3')]]></db:parameterized-query>
</db:insert>
<db:insert config-ref="Mysql_Database_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[INSERT INTO B (email) values ('abc@xyz.com')]]></db:parameterized-query>
</db:insert>
</flow>
,
Mulesoft允许一次执行一个操作。您不能一起执行两个插入操作。
批量操作接受批量输入参数,但仅允许一个操作插入,更新或删除。
但是,如果要合并两个插入操作,则可以使用存储过程。您可以在存储过程中传递动态输入参数,这将解决您的问题
<db:stored-procedure config-ref="dbConfig">
<db:sql>{ call updateEmployee('EmailID',:emailID) }</db:sql>
<db:input-parameters>
#[{'emailID' : payload}]
</db:input-parameters>
</db:stored-procedure>