2016-05-17 27 views
1

我有用于选择查询的mule数据库连接器的问题。我有一个字符串ArrayList给参数里面。上述不符合3.7.3骡子ESB工作Mule Oracle数据库连接器SQL与IN运算器

Mule Sql Query - passing parameters to the IN operator

解决方案,我已经试过在很多方面和搜索的结果。除了这份文件外,我还没有确定的方式,直到这个时候。

我使用的查询如下:

SELECT * FROM db_table其中id在(2,3,4)

在我的例子2,3,4是包含数组列表我的流程变量中。

有什么建议吗?

回答

0

我再次使用这个答案解决了相关的问题:

Mule Sql Query - passing parameters to the IN operator

在这里,在这个Java块,我已经建造我的查询并将其放到名为sql的流变量中:

public Object onCall(MuleEventContext eventContext) throws Exception { 
    // TODO Auto-generated method stub 
    ArrayList<String> vib_list = eventContext.getMessage().getInvocationProperty("vibs"); 
    String locale = eventContext.getMessage().getInvocationProperty("lang_locale").toString(); 
    StringBuilder query = new StringBuilder(); 
    String queryBase = "select distinct(matnr) from cated_prodrelease where matnr in("; 
    query.append(queryBase); 
    int numIndices = ((ArrayList<Integer>)eventContext.getMessage().getInvocationProperty("vibs")).size(); 
    ArrayList<String> indices = new ArrayList<String>(); 
    for(int i=0; i<numIndices; i++) { 
     indices.add("'"+ vib_list.get(i) + "'"); 
} 
    query.append(StringUtils.join(indices, ", ")); 
    query.append(") " + "AND locale = '" + locale + "' " + "AND release_type = 'PI_RELEASE'"); 
    String finalQuery = query.toString(); 
    eventContext.getMessage().setInvocationProperty("sql", finalQuery); 
    return eventContext.getMessage();  
} 

然后,我已经直接在db连接器的动态查询参数上使用这个流量变量sql,它完美的工作。

<db:select config-ref="PDP_Configuration" doc:name="Database"> 
    <db:dynamic-query><![CDATA[#[flowVars.sql]]]></db:dynamic-query> 
</db:select> 

这不是一个官方的答案,但我相信,骡开发人员应该找到这样的重大问题正式解决方案。我希望它有帮助!

0

你可以做这样的事情。我使用MySQL作为示例,只需将其更改为Oracle。

enter image description here

<flow name="dbqueryFlow"> 
     <http:listener config-ref="HTTP_Listener_Configuration" path="/db" doc:name="HTTP"/> 
     <set-payload value="#[[1,3,5]]" doc:name="Mock Set of Ids"/> 
     <expression-component doc:name="Set IDs to String"><![CDATA[ids = payload.toString().replace("[", "").replace("]", "").replace(", ", ","); 
flowVars['ids'] = ids;]]></expression-component> 
     <logger message="SID === #[flowVars.ids]" level="INFO" doc:name="Logger"/> 
     <db:select config-ref="MySQL_Configuration" doc:name="Database" > 
      <db:dynamic-query><![CDATA[SELECT * FROM bridge WHERE id IN (#[flowVars.ids])]]></db:dynamic-query> 
     </db:select> 
     <logger level="INFO" doc:name="Logger"/> 
    </flow> 

希望这有助于

+0

其实我正在使用字符串列表,我刚才给我的问题整数的例子。但是,我在数据库中搜索的数据类型是VARCHAR,所以这不起作用,但它当然适用于数字数据类型。谢谢你的回答。 – Hayra