Oracle sql语句,in函数有助于减少or条件的复合使用,但是如果in的条件中多于1000个表达式数会报ORA-01795的提示错误。这是Oracle考虑性能问题做的限制。可以把条件拆分,用多个or和in拼接查询。解决办法如下,并附带两个数组的处理函数。
/**
* @param pks in查询的条件数组
* @param len 每个查询语句中出现的条件个数
* @param field 查询字段
* @return
*/
public static String getInSqlByPks(String[] pks, int len, String field) {
StringBuffer sql = new StringBuffer("");
if (len <= 0 || len>1000) {
len = 1000;
}
if (pks.length > len) {
int count = pks.length/len;
for (int i = 0; i <= count; i++) {
String[] tempPks = subArrayFree(pks, len*i, len*(i+1));
if (tempPks!=null && tempPks.length>0) {
if (i > 0) {
sql.append(" or ");
}
sql.append(field+arrayToSqlCond(tempPks, true));
}
}
} else {
sql.append(field+arrayToSqlCond(pks, true));
}
return sql.toString();
}
/**
* @description 截取数组
* @param arr 要截取的数组
* @param begin 开始截取下标
* @param end 结束截取下标
* @return
*/
public static String[] subArrayFree(String[] arr, int begin, int end) {
if (arr == null)
return null;
if (arr.length == 0 || (arr.length - 1) < begin)
return null;
if (end > arr.length)
end = arr.length;
ArrayList<String> list = new ArrayList<String>();
for (int i = begin; i < end; i++){
list.add(arr[i]);
}
return list.toArray(new String[0]);
}
/**
* 数组转换为sql查询条件
* @param arr 条件数组
* @param isIn 是否是包含(in)或者不包含(not in)
* @return
*/
public static String arrayToSqlCond(String[] arr, boolean isIn) {
StringBuffer cond = new StringBuffer("");
if (arr != null) {
int len = arr.length;
if (len == 1) {
if (isIn) {
cond.append(" = '");
} else {
cond.append(" != '");
}
cond.append(arr[0]).append("'");
} else if (len > 1) {
if (isIn) {
cond.append(" in ('");
} else {
cond.append(" not in ('");
}
for (int i = 0; i < len; i++) {
cond.append(arr[i]);
if (i < len - 1)
cond.append("','");
}
cond.append("')");
}
}
return cond.toString();
}