用IN查询时-出现:ORA-01795:列表中的最大表达式数为1000的解决方案

本文介绍如何通过代码实现避免Oracle数据库ORA-01795错误,该错误发生在SQL语句中IN子句后的列表超过1000个元素。提供了一个Java示例,展示了如何将长列表拆分为多个IN子句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看ORA-01795中给出的内容是SQL语句的 expressions 中list接受的最大值是1000,查了下ORA-01795的说明,确定问题出在IN后括号里的主键值超过1000上。

 解决方案:这段代码只要测试所以当超过2个就拼接

	  public static void main(String[] args) throws Exception {
		  List<String> list = new ArrayList<String>();
		  list.add("机构1");
		  list.add("机构2");
		  list.add("机构3");
		  list.add("机构4");
		  list.add("机构5");
		  list.add("机构6");
		  list.add("机构7");
		  list.add("机构8");
		  list.add("机构9");
		  System.out.println(getString(list));
	    }

	  private static String getString(List<String> list){
		  StringBuffer sb = new StringBuffer();
		  int inNum = 1; //已拼装IN条件数量
		  for(int i=0; i<list.size(); i++) {

		      if(StringUtil.isEmpty(custNOs[i])) continue;
		      
		      //这里不要犯低级错误而写成:if(i == custNOs.length)
		      if(i == (list.size()-1))
		          sb.append("'" + list.get(i) + "'");    //SQL拼装,最后一条不加“,”。
		      else if(inNum==2 && i>0) {
		          sb.append("'" + list.get(i) + "' ) OR CUST_NO IN ( ");    //解决ORA-01795问题
		          inNum = 1;
		      }
		      else {
		          sb.append("'" + list.get(i) + "', ");
		          inNum++;
		      }

		  }
		return sb.toString();
		  
	    }

实际用的时候代码:

		  StringBuffer sb = new StringBuffer();
		  int inNum = 1; //已拼装IN条件数量
		  for(int i=0; i<list.size(); i++) {

		      if(StringUtil.isEmpty(custNOs[i])) continue;
		      
		      //这里不要犯低级错误而写成:if(i == custNOs.length)
		      if(i == (list.size()-1))
		          sb.append("'" + list.get(i) + "'");    //SQL拼装,最后一条不加“,”。
		      else if(inNum==1000 && i>0) { //这里数据最大支持1000行,所以这里当超过1000的时候就拼接
		          sb.append("'" + list.get(i) + "' ) OR CUST_NO IN ( ");    //解决ORA-01795问题
		          inNum = 1;
		      }
		      else {
		          sb.append("'" + list.get(i) + "', ");
		          inNum++;
		      }

		  }
		return sb.toString();

返回结果:

 

实际主要代码:

mybatis的部分写法:
数据库字段名 in ( ${ 传入的值sb.toString() } )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值