【问题标题】:Mule Oracle Database Connector SQL with IN OPERATOR带有 IN OPERATOR 的 Mule Oracle 数据库连接器 SQL
【发布时间】:2016-05-17 11:57:17
【问题描述】:

我使用 mule 的数据库连接器进行选择查询时遇到问题。我有一个字符串数组列表要在参数中给出。

Mule Sql Query - passing parameters to the IN operator

上面提到的解决方案不适用于 3.7.3 Mule ESB,我已经尝试了很多方法并进行了搜索。除了这个文件,到目前为止我还没有确定的方法。

我正在使用以下查询:

select * from db_table where id in (2,3,4)

在我的示例中,2,3,4 在我的流变量中,其中包含数组列表。

有什么建议吗?

【问题讨论】:

    标签: database mule mule-component


    【解决方案1】:

    你可以做这样的事情。我以 MySQL 为例,改成 Oracle 就好了。

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

    希望对你有帮助

    【讨论】:

    • 实际上我正在使用字符串列表,我刚刚在我的问题上给出了整数示例。但是我在数据库中搜索的数据类型是 VARCHAR,所以这不起作用,但它当然适用于数字数据类型。感谢您的友好回答。
    【解决方案2】:
    <set-variable variableName="CHUNKVIBLIST" value="#[new ArrayList()]" doc:name="Set CHUNKVIBLIST Variable"/>
        <expression-component doc:name="Expression"><![CDATA[int chunkSize = 1000;
                for (int i = 0; i < flowVars.VIBLIST.size(); i += chunkSize) {      flowVars.CHUNKVIBLIST.add("'"+org.apache.commons.lang.StringUtils.join(flowVars.VIBLIST.subList(i, i + chunkSize >=  flowVars.VIBLIST.size() ?  flowVars.VIBLIST.size() : i + chunkSize),"','")+"'");
                }]]></expression-component>
            
        <foreach collection="#[flowVars.CHUNKVIBLIST]" doc:name="For Each matnr batch:">
        <db:select config-ref="Mule_DB_Configuration" doc:name="Select statement">
                <db:dynamic-query><![CDATA[SELECT DISTINCT(MATNR) FROM cated_prodrelease where MATNR IN (#[payload])]]></db:dynamic-query>
        </db:select>
        </foreach>
    

    2021 年 3 月 1 日更新旧答案是我的初学者日子,我刚刚决定 要更新我的答案并进行上述更改,您应该创建有效负载 包含逗号分隔的字符串以使用正在使用 IN 的答案 语句作为动态查询。

    【讨论】:

    • 如何使用这种方法解决 SQL 注入问题?我认为字符串连接并不是创建 SQL 语句的最佳实践。
    • 使用 SQL 注入更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2016-11-03
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    相关资源
    最近更新 更多