在 Mule (3.8.1) 和 Anypoint Studio(6.2.1) 中从 SQL Server 2016 获取结果集
Fetching the resultsets from SQL Server 2016 in Mule (3.8.1) and Anypoint Studio(6.2.1)
在当前的 Mule 流程中,我能够在 SQL Server 2016 中执行一个存储过程,结果集以 {resultSet1=[{ROWEXISTS=1}]} 的形式返回。这将命中流变量 rowExists,我将对变量集做出进一步的决定。我从存储过程中期望的值为 0 或 1,并且它在 ROWEXISTS 列中正确返回。现在我的问题是如何从结果集中访问 ROWEXISTS 列。我尝试了 #[payload.get(0).ROWEXISTS] 和 #[payload.get(0)['ROWEXISTS']] 等。但没有运气。它要么给我一个错误,要么为空。
下面给出了我正在使用的示例 XML 负载。我将从 XML 负载中提取 EmployeeNumber 并执行存储过程来丰富消息。目标变量#[flowVars.rowExists]。但是我在这里看到的是我从存储过程中得到的 0 或 1 的特定值。
我无法检索该值。非常感谢任何帮助。
<Employees>
<Employee>
<CompanyCode>SMBMI</CompanyCode>
<EmployeeLastName>LastName1</EmployeeLastName>
<EmployeeFirstName>FirstName1</EmployeeFirstName>
<MiddleName/>
<EmployeeNumber>00479</EmployeeNumber>
<Department>Public Safety</Department>
</Employee>
<Employee>
<CompanyCode>SMBMI</CompanyCode>
<EmployeeLastName>LastName2</EmployeeLastName>
<EmployeeFirstName>FirstName2</EmployeeFirstName>
<MiddleName/>
<EmployeeNumber>08945</EmployeeNumber>
<Department>Transport</Department>
</Employee>
</Employees>
Mule 流程 xml 如下所示
<flow name="DBtest" >
<file:inbound-endpoint path="C:\Backup\Files\Input" moveToDirectory="C:\Backup\Files\Output" connector-ref="FileGodsake" responseTimeout="10000" doc:name="File">
<file:filename-regex-filter pattern="(EmployeeList){1}.*(\.xml)" caseSensitive="true"/>
</file:inbound-endpoint>
<splitter expression="#[xpath3('//Employee',payload,'NODESET')]" doc:name="Splitter"/>
<mulexml:dom-to-xml-transformer doc:name="DOM to XML"/>
<enricher target="#[flowVars.rowExists]" doc:name="Message Enricher">
<db:stored-procedure config-ref="adventure" doc:name="Check Employee Exists">
<db:parameterized-query><![CDATA[{CALL EmployeeExists (:EmployeeNumber)}]]></db:parameterized-query>
<db:in-param name="EmployeeNumber" value="#[xpath3('//EmployeeNumber',payload,'STRING')]"/>
</db:stored-procedure>
</enricher>
<logger message="Employee Number: #[xpath3('//EmployeeNumber',payload,'STRING')] and If Exists is #[flowVars.rowExists] . The get request #[flowVars.rowExists]" level="INFO" doc:name="Logger"/>
<choice doc:name="Choice">
<when expression="#[flowVars.rowExists]">
<db:stored-procedure config-ref="adventure" doc:name="Update Employee">
<db:parameterized-query><![CDATA[{CALL UpdateEmployee (:CompanyCode,:EmployeeLastName,:EmployeeFirstName,:MiddleName,:EmployeeNumber,:Department
,:DeptNumber)}]]></db:parameterized-query>
<db:in-param name="CompanyCode" type="VARCHAR" value="#[xpath3('//CompanyCode',payload,'STRING')]"/>
<db:in-param name="EmployeeLastName" type="VARCHAR" value="#[xpath3('//EmployeeLastName',payload,'STRING')]"/>
<db:in-param name="EmployeeFirstName" type="VARCHAR" value="#[xpath3('//EmployeeFirstName',payload,'STRING')]"/>
<db:in-param name="MiddleName" type="VARCHAR" value="#[xpath3('//MiddleName',payload,'STRING')]"/>
<db:in-param name="EmployeeNumber" type="VARCHAR" value="#[xpath3('//EmployeeNumber',payload,'STRING')]"/>
<db:in-param name="Department" type="VARCHAR" value="#[xpath3('//Department',payload,'STRING')]"/>
</db:stored-procedure>
</when>
<otherwise>
<db:stored-procedure config-ref="adventure" doc:name="Insert Employee">
<db:parameterized-query><![CDATA[{CALL InsertEmployee (:CompanyCode,:EmployeeLastName,:EmployeeFirstName,:MiddleName,:EmployeeNumber,:Department)}]]></db:parameterized-query>
<db:in-param name="CompanyCode" type="VARCHAR" value="#[xpath3('//CompanyCode',payload,'STRING')]"/>
<db:in-param name="EmployeeLastName" type="VARCHAR" value="#[xpath3('//EmployeeLastName',payload,'STRING')]"/>
<db:in-param name="EmployeeFirstName" type="VARCHAR" value="#[xpath3('//EmployeeFirstName',payload,'STRING')]"/>
<db:in-param name="MiddleName" type="VARCHAR" value="#[xpath3('//MiddleName',payload,'STRING')]"/>
<db:in-param name="EmployeeNumber" type="VARCHAR" value="#[xpath3('//EmployeeNumber',payload,'STRING')]"/>
<db:in-param name="Department" type="VARCHAR" value="#[xpath3('//Department',payload,'STRING')]"/>
</db:stored-procedure>
</otherwise>
</choice>
</flow >
我想提取 ROWEXISTS 的值并将其更新为目标变量 rowExists
试试这个表达式 - #[payload.resultSet1.get(0).ROWEXISTS]
好的。我要感谢 Senthil。 Enricher 源应该是
[有效载荷。resultSet1.get(0).ROWEXISTS==1]。这将根据该行是作为 1 还是 0
返回来评估为 true 或 false
在当前的 Mule 流程中,我能够在 SQL Server 2016 中执行一个存储过程,结果集以 {resultSet1=[{ROWEXISTS=1}]} 的形式返回。这将命中流变量 rowExists,我将对变量集做出进一步的决定。我从存储过程中期望的值为 0 或 1,并且它在 ROWEXISTS 列中正确返回。现在我的问题是如何从结果集中访问 ROWEXISTS 列。我尝试了 #[payload.get(0).ROWEXISTS] 和 #[payload.get(0)['ROWEXISTS']] 等。但没有运气。它要么给我一个错误,要么为空。
下面给出了我正在使用的示例 XML 负载。我将从 XML 负载中提取 EmployeeNumber 并执行存储过程来丰富消息。目标变量#[flowVars.rowExists]。但是我在这里看到的是我从存储过程中得到的 0 或 1 的特定值。 我无法检索该值。非常感谢任何帮助。
<Employees>
<Employee>
<CompanyCode>SMBMI</CompanyCode>
<EmployeeLastName>LastName1</EmployeeLastName>
<EmployeeFirstName>FirstName1</EmployeeFirstName>
<MiddleName/>
<EmployeeNumber>00479</EmployeeNumber>
<Department>Public Safety</Department>
</Employee>
<Employee>
<CompanyCode>SMBMI</CompanyCode>
<EmployeeLastName>LastName2</EmployeeLastName>
<EmployeeFirstName>FirstName2</EmployeeFirstName>
<MiddleName/>
<EmployeeNumber>08945</EmployeeNumber>
<Department>Transport</Department>
</Employee>
</Employees>
Mule 流程 xml 如下所示
<flow name="DBtest" >
<file:inbound-endpoint path="C:\Backup\Files\Input" moveToDirectory="C:\Backup\Files\Output" connector-ref="FileGodsake" responseTimeout="10000" doc:name="File">
<file:filename-regex-filter pattern="(EmployeeList){1}.*(\.xml)" caseSensitive="true"/>
</file:inbound-endpoint>
<splitter expression="#[xpath3('//Employee',payload,'NODESET')]" doc:name="Splitter"/>
<mulexml:dom-to-xml-transformer doc:name="DOM to XML"/>
<enricher target="#[flowVars.rowExists]" doc:name="Message Enricher">
<db:stored-procedure config-ref="adventure" doc:name="Check Employee Exists">
<db:parameterized-query><![CDATA[{CALL EmployeeExists (:EmployeeNumber)}]]></db:parameterized-query>
<db:in-param name="EmployeeNumber" value="#[xpath3('//EmployeeNumber',payload,'STRING')]"/>
</db:stored-procedure>
</enricher>
<logger message="Employee Number: #[xpath3('//EmployeeNumber',payload,'STRING')] and If Exists is #[flowVars.rowExists] . The get request #[flowVars.rowExists]" level="INFO" doc:name="Logger"/>
<choice doc:name="Choice">
<when expression="#[flowVars.rowExists]">
<db:stored-procedure config-ref="adventure" doc:name="Update Employee">
<db:parameterized-query><![CDATA[{CALL UpdateEmployee (:CompanyCode,:EmployeeLastName,:EmployeeFirstName,:MiddleName,:EmployeeNumber,:Department
,:DeptNumber)}]]></db:parameterized-query>
<db:in-param name="CompanyCode" type="VARCHAR" value="#[xpath3('//CompanyCode',payload,'STRING')]"/>
<db:in-param name="EmployeeLastName" type="VARCHAR" value="#[xpath3('//EmployeeLastName',payload,'STRING')]"/>
<db:in-param name="EmployeeFirstName" type="VARCHAR" value="#[xpath3('//EmployeeFirstName',payload,'STRING')]"/>
<db:in-param name="MiddleName" type="VARCHAR" value="#[xpath3('//MiddleName',payload,'STRING')]"/>
<db:in-param name="EmployeeNumber" type="VARCHAR" value="#[xpath3('//EmployeeNumber',payload,'STRING')]"/>
<db:in-param name="Department" type="VARCHAR" value="#[xpath3('//Department',payload,'STRING')]"/>
</db:stored-procedure>
</when>
<otherwise>
<db:stored-procedure config-ref="adventure" doc:name="Insert Employee">
<db:parameterized-query><![CDATA[{CALL InsertEmployee (:CompanyCode,:EmployeeLastName,:EmployeeFirstName,:MiddleName,:EmployeeNumber,:Department)}]]></db:parameterized-query>
<db:in-param name="CompanyCode" type="VARCHAR" value="#[xpath3('//CompanyCode',payload,'STRING')]"/>
<db:in-param name="EmployeeLastName" type="VARCHAR" value="#[xpath3('//EmployeeLastName',payload,'STRING')]"/>
<db:in-param name="EmployeeFirstName" type="VARCHAR" value="#[xpath3('//EmployeeFirstName',payload,'STRING')]"/>
<db:in-param name="MiddleName" type="VARCHAR" value="#[xpath3('//MiddleName',payload,'STRING')]"/>
<db:in-param name="EmployeeNumber" type="VARCHAR" value="#[xpath3('//EmployeeNumber',payload,'STRING')]"/>
<db:in-param name="Department" type="VARCHAR" value="#[xpath3('//Department',payload,'STRING')]"/>
</db:stored-procedure>
</otherwise>
</choice>
</flow >
我想提取 ROWEXISTS 的值并将其更新为目标变量 rowExists
试试这个表达式 - #[payload.resultSet1.get(0).ROWEXISTS]
好的。我要感谢 Senthil。 Enricher 源应该是