2016-05-17 7 views
1

select照会に使用していたmuleのデータベース・コネクターに問題があります。私はパラメータを内部に与える文字列のarraylistを持っています。 3.7.3ミュールESBでは動作しません上記のMule Oracleデータベース・コネクター・イン・オペレーター

Mule Sql Query - passing parameters to the IN operator

ソリューションは、私は多くの方法で試してみましたし、そのために検索しました。この文書を除いて、私が今までに確立した明確な方法はありません。私の例2,3,4で

(2,3,4)

のidは、ArrayListのが含まれている私のフロー変数の内側にある場合のDB_Tableから選択

*:

私は下のクエリを使用しています。

提案がありますか?

答えて

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();  
} 

次に、このフロー変数sqlをdbコネクタのdynamic-queryパラメータに直接使用しました。これは完全に機能しました。

<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

関連する問題