ORA-01795: 列表中的最大表达式数为 1000
解决的方法是拆分列表。
需求是提供了:号单文件,必须按号单文件查询,如果是表查询,当然可以采用join关联等实现。
为了把几千个号单拆分成100个为一组,写了个java方法,进行sql语句的处理。
/**
* Example:
* List sqhlist=[aa,bb,cc,dd,ee,ff,gg] ;
* Test.getSqlStrByList(sqhList,3,"SHENQINGH")=
* "SHENQING IN ('aa','bb','cc') OR SHENQINGH IN ('dd','ee','ff') OR SHENQINGH IN ('gg')"
*
* 把超过1000的申请号集合拆分成数量splitNum的多组sql的in 集合。
* @param sqhList 申请号的List
* @param splitNum 拆分的间隔数目,例如: 1000
* @param columnName SQL中引用的字段名例如: Z.SHENQINGH
* @return
*/
public String getSqlStrByList(List sqhList, int splitNum,String columnName) {
if(splitNum>1000) //因为数据库的列表sql限制,不能超过1000.
return null;
StringBuffer sql = new StringBuffer("");
if (sqhList != null) {
sql.append(" ").append(columnName).append (" IN ( ");
for (int i = 0; i < sqhList.size(); i++) {
sql.append("'").append(sqhList.get(i) + "',");
if ((i + 1) % splitNum == 0 && (i + 1) < sqhList.size()) {
sql.deleteCharAt(sql.length() - 1);
sql.append(" ) OR ").append(columnName).append (" IN (");
}
}
sql.deleteCharAt(sql.length() - 1);
sql.append(" )");
}
return sql.toString();
}
/**
* 把超过1000的申请号数组拆分成数量splitNum的多组sql的in 集合。
* @param sqhArrays 申请号的数组
* @param splitNum 拆分的间隔数目,例如: 1000
* @param columnName SQL中引用的字段名例如: Z.SHENQINGH
* @return
*/
public String getSqlStrByArrays(String[] sqhArrays, int splitNum,String columnName){
return getSqlStrByList(Arrays.asList(sqhArrays),splitNum,columnName);
}