系统函数解决问题:ORA-01795maximum number of expression in a list is 1000

1 概述

需求:
基于ORACLE 数据库建立查询的时候,会碰到这样的问题:
ORA-01795maximum number of expression in a list is 1000
导致这个问题的原因是因为SQL语句中用到了IN字句,结果IN中的元素个数超过了1000导致了这个错误。
实现方案
开发一个系统函数Process1000LimitOfIn("字段", 树或下拉参数),让其输出
(字段 in (list1) or 字段 in (list2))
函数有两个参数:
第一个参数:字段名,如果是可视化,直接拖字段,如果是原生sql最好用英文双引号括起来,如"table1.A"
第二个参数:smartbi的多选树或下拉框参数,直接拖参数即可

2 自定义函数

自定义函数的设置方法见wiki示例:
(系统函数——自定义函数)
https://history.wiki.smartbi.com.cn/pages/viewpage.action?pageId=21954994

2.1 编写自定义系统函数类Process1000LimitOfIn

package smartbi.freequery.expression.function;
import smartbi.freequery.metadata.SQLPart;
import smartbi.freequery.util.SQLPartType;
import smartbi.util.StringUtil;
public class Process1000LimitOfIn extends Function {
@Override
public boolean checkParams() {
if (params.length==2)
return true;
else
return false;
}
@Override
public void execute() {
String fieldName = params[0].getSqlStr().trim();
fieldName = trim(fieldName,"\"");
fieldName = trim(fieldName,"'");
String fieldValue = params[1].getSqlStr().trim();
String sep = ",";
String[] fieldValueArray = fieldValue.split(sep);
int size = 1000;
long count = Math.round(Math.ceil(((double)fieldValueArray.length)/size));
if(count ==1){
result.add(new SQLPart(SQLPartType.SQLSTR, fieldName + " in (" + fieldValue +")"));
return;
}
//TODO
StringBuilder sqlSb = new StringBuilder();
sqlSb.append("(");
for(int i =0; i<count; i++){
int jLen = (i+1)*size ;
jLen = (jLen>fieldValueArray.length)?fieldValueArray.length:jLen;
StringBuilder sb = new StringBuilder();
for(int j = i*size; j<jLen; j++){
sb.append(fieldValueArray[j]).append(sep);
}
String sbStr = sb.toString();
if(i>0){
sqlSb.append(" or ");
}
sqlSb.append(fieldName + " in (" + sbStr.substring(0, sbStr.length()-sep.length())+")");
}
sqlSb.append(" ) ");
result.add(new SQLPart(SQLPartType.SQLSTR, sqlSb.toString()));
}
private String trim(String srcStr, String toTrimStr){
if(StringUtil.isNullOrEmpty(srcStr)){
return srcStr;
}
srcStr = srcStr.trim();
while(srcStr.startsWith(toTrimStr)){
srcStr = srcStr.substring(toTrimStr.length());
srcStr = srcStr.trim();
}
while(srcStr.endsWith(toTrimStr)){
srcStr = srcStr.substring(0, srcStr.length()-toTrimStr.length());
srcStr = srcStr.trim();
}
return srcStr;
}
@Override
public String getMDXValue() {
return "";
}
}

2.2 编写升级类

该升级类的操作是向知识库t_restree(资源树)表中插入一条数据,父节点为catalog_string(字符串),资源类型为FUNCTION(函数)
该操作用于后面在资源树中新建同名的自定义函数
package smartbi.ext.function.upgrade;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import org.apache.log4j.Logger;
import smartbi.repository.UpgradeTask;
import smartbi.util.DBType;
/**