当前位置: 代码迷 >> SQL >> oracle的SQL话语in中的限制
  详细解决方案

oracle的SQL话语in中的限制

热度:79   发布时间:2016-05-05 12:32:30.0
oracle的SQL语句in中的限制
最近做一个验证文件中的数据是否在数据库中存在的小验证,因为传到数据库中验证的只是两个字段而已,如:select t.id from table where to_char(t.import_date,'yyyy-MM-dd')=#importDate# and t.device_no in ($deviceNo$),importDate字段是固定的,deviceNo字段是变化的.而在oracle中,SQL的in的内容是有限制的,只能1000个传入值,而导入文件中,就可能有上万条记录,如果一条一条地验证,将有上万次与数据库的交互.所以想到了按照1000值来拆分和拼装SQL.

/*** 验证导入数据*/@Overridepublic String checkKJLIndexExcel(List<KJLIndexImportDateModel> list)			throws Exception {		int size=list.size();		StringBuffer str=new StringBuffer();// oracle限定的sql in 最大表达式数为 1000// 否则将出现java.sql.SQLException: ORA-01795 的错误//用设备号和导入时间来验证是否有相同的数据,将设备号拆开来in进去,减少与数据库的交互		if(size<1000){//值小于1000			str=getBaseId(list);		}else{			int i2=0;			for(int i=0;i<(size/1000)+1;i++){				List list2 = null;				try {					list2 = list.subList(i2, i2 + 1000);//数组越界,说明i2+1000超过了list的size,到了list/1000的余数阶段				} catch (IndexOutOfBoundsException e) {					list2 = list.subList(i2, list.size());				}				i2 += 1000;				String str2=getBaseId(list2);//拼装SQL,到数据库中验证				if(StringUtil.isEmpty(str)){					str.append(str2);				}else{					str.append(",").append(str2);				}		}	}	return str;}
  相关解决方案