[原著]java或者Js 代码逻辑来处理 突破 oracle sql “IN”长度的极限的问题

Posted ✧*꧁一品堂.技术学习笔记꧂*✧.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[原著]java或者Js 代码逻辑来处理 突破 oracle sql “IN”长度的极限的问题相关的知识,希望对你有一定的参考价值。

注:本文出自:博主自己研究验证可行

 

[原著]java或者Js  代码逻辑来处理  突破 oracle  sql “IN”长度的极限的问题

   在很多的时候 使用 select  *  from  tab_name t where  t.id in (1,2…………1000) ;  的固定方式来查询数据的时候。会有一种这个情况出现:

则是 in 里面的内容 太长了; 而 oracle数据库支持的长度是 100个内容。

         那么对于这个情况该怎么办呢。其实是很简单的,in 本身就是  所有 内容的or查询。

         对于此的办法是:把in的里面的参数给拆分成很多个。

        具体实现如下:

1:java 代码的实现:

  1  public List stapleToCzgkzxNew(DaoFactory daoFactory,String orgType, List lstSource ,List lstVo_jjfl) throws SQLException, Exception {
  2 
  3         List lstTarget = new ArrayList();
  4 
  5         try {
  6 			/**
  7 			 * 需要  进行  经济分类 辅助核算
  8 			 */
  9 			List lstIds_jjfl = new ArrayList();
 10 			//取出 集合中的 id
 11 			if(lstVo_jjfl.size()>0){
 12 				 Iterator itSource_jjfl = lstVo_jjfl.iterator();
 13 			     while (itSource_jjfl.hasNext()) {
 14 			         ZfpzVO vo = (ZfpzVO) itSource_jjfl.next();
 15 			         lstIds_jjfl.add(String.valueOf(vo.getGk_zfpz_id()));
 16 			     }
 17 		 //---start 20180315  新增 -------目的:提高生成数据执行速度,按照凭证号来查询数据。取消掉相同数据的合并问题---------------------    
 18 			//把  id  拼接成字符串      1,2,3,4,5,6
 19 	        int listLentgh=lstIds_jjfl.size();
 20 		    int intFalg=50;//in 里面包含值的阀值
 21 		    List  lsId=new ArrayList();//存放id字符串集合
 22 		    String stra="";
 23 		    for (int i=0;i<listLentgh;i++){
 24 				   if(i%intFalg == 0 && i != 0   ){
 25 					   lsId.add(stra);
 26 					   stra="";
 27 				   }
 28 				  if(i%intFalg == 0  ){
 29 					  stra = ""+lstIds_jjfl.get(i);
 30 				  }else{
 31 					  stra = stra+","+lstIds_jjfl.get(i);
 32 				  }
 33 				  if(i+1==listLentgh && ( listLentgh !=1 &&i%intFalg != 0)){
 34 					  lsId.add(stra);
 35 				  } else if(i+1==listLentgh &&  listLentgh  ==1 && i%intFalg == 0 ){
 36 					  lsId.add(stra);
 37 				  }
 38 		    }
 39 		  //---end 20180315  新增 ---------------------------- 
 40 
 41 
 42 		     //---start 20180315 修改 -------目的:提高生成数据执行速度---------------------       
 43 			  List Gkzfpz_jjflList =ZwvchCommonHelper.factory().getGkzfpz_jjflList(daoFactory, lsId,orgType);
 44 45 
 46 //下面是拼接 sql 的逻辑处理
 47 
 48 
 49     */
 50     public  List getGkzfpz_jjflList (DaoFactory daoFactory, List lstZfpzId,String orgType){
 51     	String  strSQL ="select  * from view_k3_zfzxz_zfpz v    WHERE 1 = 1   ";
 52 		List<Map<String, Object>>lstZfpz = new ArrayList();
 53 
 54     	try {
 55 
 56 			  if(lstZfpzId.size()>0) {
 57 				  strSQL += " AND ( ";
 58 	        	  for (int index=0 ;index <lstZfpzId.size();index ++) {
 59 	        		  if(index == 0){
 60 	        			  strSQL += "   v.id in ("+lstZfpzId.get(index)+")";
 61 	        		  }else {
 62 	        			  strSQL += " OR v.id in ("+lstZfpzId.get(index)+")";
 63 	        		  }
 64 
 65 	             }
 66 	               strSQL += ")";
 67 			  }
 68 			  log.info("_______国库支付中心账务:直接支付凭证  ___________strSQL="+strSQL);
 69     		  lstZfpz = daoFactory.getDao().getJdbcTemplate().queryForList(strSQL);
 70               for(int i=0;i<lstZfpz.size();i++){
 71               	lstZfpz.get(i).put("org_type",orgType);
 72               }
 73 			  log.info("_______国库支付中心账务:直接支付凭证  ___________查询结果="+lstZfpz.size()+";======:"+lstZfpz.toString()) ;
 74 
 75 		} catch (Exception e) {
 76 			e.printStackTrace();
 77 		}
 78     	 return lstZfpz;
 79     }
 80 


2:使用JS 的逻辑处理

  1             var rows=[];  2 
  3 	   	rows = mainGrid.getSelections();
  5 		if(rows.length>0){
  6 			debugger;
  7                  var balance_type="";
  8               
 12                 var rowsLength=rows.length;
 13         	    var intFalg=30;//in 里面包含值的阀值
 14         	    var ids=[];//id拼接存放的合集
 15         	    var str_id="";
 16         	    for (var i=0;i<rowsLength;i++){
 17         		   var row =rows[i];
 18         		   if(i%intFalg == 0 && i != 0   ){
 19         			   ids.push(str_id);
 20         			   str_id="";
 21         		   }
 22         		  if(i%intFalg == 0  ){
 23         			  str_id = ""+row.id;
 24         		  }else{
 25         			  str_id = str_id+","+row.id;
 26         		  }
 27         		  if(i+1==rowsLength && ( rowsLength !=1 &&i%rowsLength != 0)){
 28         			  ids.push(str_id);
 29         		  } else if(i+1==rowsLength &&  rowsLength  ==1 && i%intFalg == 0 ){
 30         			  ids.push(str_id);
 31         		  }
 32         	     }
 33 34 
  
















以上是关于[原著]java或者Js 代码逻辑来处理 突破 oracle sql “IN”长度的极限的问题的主要内容,如果未能解决你的问题,请参考以下文章

JS 逻辑

ajax上传文件后,后台java如何接收(求后台接收的完整代码)

怎么让java类文件突破65k限制

JS 函数防抖和函数节流

权利的游戏 S0803

Java中的异常