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

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

  • 举例(假设wid的参数值格式是这样:{"wid":"111,2222,3344,5555,....."})
    • 如上

举例(假设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
        
        AND ','||A .WID||',' IN(
        
            ','||#{itm}||','
        
            )
        
        
            
        
        
            AND TIME_YEAR = #{year}
        
        ORDER BY A.STREET_ID ASC,A."TYPE" ASC,A.WID,A.ORDER_NO ASC

如上

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

    @Override
    public List queryStreetTable(HashMap params) {
        try{
            List wids;
            String wid=String.valueOf(params.get("wid"));
            if(!(wid==null ||"".equals(wid))){
              wids=Arrays.asList(wid.split(",")) ;
                params.put("wids",wids);
            }
            List 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函数需要做处理,将

   
            AND instr(#{wids },A.WID) > 0
        

就改成如下即可:


        AND ','||A .WID||',' IN(
        
            ','||#{itm}||','
        
            )
        

你可能感兴趣的:(若参数值)