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.

Java代码 复制代码 收藏代码
  1. /**
  2. * 验证导入数据
  3. */
  4. @Override
  5. public String checkKJLIndexExcel(List<KJLIndexImportDateModel> list)
  6. throws Exception {
  7. int size=list.size();
  8. StringBuffer str=new StringBuffer();
  9. // oracle限定的sql in 最大表达式数为 1000
  10. // 否则将出现java.sql.SQLException: ORA-01795 的错误
  11. //用设备号和导入时间来验证是否有相同的数据,将设备号拆开来in进去,减少与数据库的交互
  12. if(size<1000){//值小于1000
  13. str=getBaseId(list);
  14. }else{
  15. int i2=0;
  16. for(int i=0;i<(size/1000)+1;i++){
  17. List list2 = null;
  18. try {
  19. list2 = list.subList(i2, i2 + 1000);
  20. //数组越界,说明i2+1000超过了list的size,到了list/1000的余数阶段
  21. } catch (IndexOutOfBoundsException e) {
  22. list2 = list.subList(i2, list.size());
  23. }
  24. i2 += 1000;
  25. String str2=getBaseId(list2);//拼装SQL,到数据库中验证
  26. if(StringUtil.isEmpty(str)){
  27. str.append(str2);
  28. }else{
  29. str.append(",").append(str2);
  30. }
  31. }
  32. }
  33. return str;
  34. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值