ORACLE结合mapper.xml讨论instr函数匹配时,若参数值长度超出了instr函数长度的限制解决方法

ORACLE结合mapper.xml讨论instr函数匹配时,若参数值长度超出了instr函数长度的限制解决方法

举例(假设wid的参数值格式是这样:{“wid”:“111,2222,3344,5555,…”})

这是一个普通的sql

    SELECT A.STREET_NAME,A.TYPE_NAME,A.WID,A.FILL_ID,A."NAME",A.FILL_REWARD_NAME,A.FILL_REWARD_NUM , to_number(B.FILL_PERIOD) AS NUM,
        B.REPORT_CONTENT AS WRITE_CONTENT,B.UPDATE_TIME AS WRITE_TIME,B.NAMEANDTEL AS FILL_NAMEANDPHONE,B.TIME_YEAR AS YEAR,B.FLAG
        from V_ALL_FILL_ITEM_INFO_HZ A
        LEFT JOIN V_ALL_FILL_REWARD B ON
        A.STREET_ID=B.STREET_ID AND A."TYPE"=B."TYPE" AND A.WID=B.WID
        AND A.SYSTEM_ID=B.SYSTEM_ID AND A.FILL_ID=B.FILL_ID
        WHERE  1=1
        <if test="wids != null and wids.size !=0">
        AND ','||A .WID||',' IN(
        <foreach collection="wids" item="itm" open="" close="" separator=",">
            ','||#{itm}||','
        </foreach>
            )
        </if>
        <!--<if test="wids != null and wids !=''">-->
            <!--AND instr(#{wids },A.WID) > 0-->
        <!--</if>-->
        <if test="year != null and year !=''">
            AND TIME_YEAR = #{year}
        </if>
        ORDER BY A.STREET_ID ASC,A."TYPE" ASC,A.WID,A.ORDER_NO ASC

如上

1、首先我们的java代码需要对获取到wid的值进行逗号分割开,然后重新封装到wids:

    @Override
    public List<HashMap> queryStreetTable(HashMap params) {
        try{
            List<String> wids;
            String wid=String.valueOf(params.get("wid"));
            if(!(wid==null ||"".equals(wid))){
              wids=Arrays.asList(wid.split(",")) ;
                params.put("wids",wids);
            }
            List<HashMap> result = this.allReportMapper.queryStreetTable(params);

            return result;
        }catch(RuntimeException e){
            this.log.error("queryScenicAllTable::",e);
            return null;
        }
    }

2,当我的wids 参数达到4000时,那么如果我用这句话AND instr(#{wids },A.WID) > 0去匹配,则会报错,超出长度,因此将他改成用 in函数,但是in函数没有逗号分隔,而instr会自动将wid的一串值逗号分隔开,因此我们用in函数需要做处理,将

   <if test="wids != null and wids !=''">
            AND instr(#{wids },A.WID) > 0
        </if>

就改成如下即可:

<if test="wids != null and wids.size !=0">
        AND ','||A .WID||',' IN(
        <foreach collection="wids" item="itm" open="" close="" separator=",">
            ','||#{itm}||','
        </foreach>
            )
        </if>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值