Mule3在查询中将数据插入2个表中

问题描述

我的有效载荷类似于以下示例

{"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>