sql in关键字使用长度超过1000问题处理
Oracle sql in关键字使用长度超过1000问题处理
在一次的工作中,由于自己的疏忽忘记了sql中in关键字的一个细节(in长度不能超过1000)导致生产sql报错:
java.sql.SQLException: ORA-01795: 列表中的最大表达式数为 1000
解决办法如下:
1.根据工具类进行列表分割
/*** 分割工具:分割成N个List**/
public static <T> List< List<T> > split( List<T> list , int offset ){return CollectionUtils.isEmpty( list ) ? null : executeSplit( list , offset <= 0 ? defOffset : offset );
}private static synchronized <T> List < List<T> > executeSplit( List<T> list, int offset ) {int size = list.size();int initialCapacity = size / offset ;if ( size % offset != 0 ){initialCapacity++;}List < List<T> > lists = new ArrayList <>( initialCapacity );for ( int i = 1 ; i <= initialCapacity ; i++ ) {int limit = offset * i;if ( size < limit ){limit = size;}lists.add( list.subList( ( offset * ( i-1 ) ) , limit ) );}return lists;
}
/*** 根据查询条件查询* List<Long> ids = Arrays.asList(1L,2L,3L,4L,.....,3500L);* UserBO userBO = new UserBO();* userBO.setIds(ids);**/
List<List<Long>> selectList = ListHandleTool.split(userBO.getIds(), 900);
userBO.setSplitSize(selectList);
userExtMapper.query(userBO);
<if test="splitSize != null and splitSize.size() > 0">and (<foreach collection="splitSize" item="ids" separator="or">id in<foreach collection="ids" item="item" index="index" open="(" separator="," close=")">#{item}</foreach></foreach>)
</if>
2.直接在sql层进行分割
<if test="null!=splitSize">where (a.id in<foreach collection="splitSize" item="item" index="index" open="(" close=")" separator=","><if test="(index % 500) == 499">'-' ) or a.id in (</if>#{item}</foreach>)
</if>
这两种方法都可以解决in关键字超过1000的问题!
注:当时因为sit和uat测试库数据量太小导致没有发现这个问题,到生产芭比Q了,苦逼…
sql in关键字使用长度超过1000问题处理相关推荐
- oracle的in的值超过3000,处理 Oracle SQL in 超过1000 的解决方案
http://www.cnblogs.com/hoojo/archive/2012/08/31/2665396.html hoojo的这篇博文里面,介绍了处理Oracle SQL in超过1000的解 ...
- 处理 Oracle SQL in 超过1000 的解决方案
处理oracle sql 语句in子句中(where id in (1, 2, ..., 1000, 1001)),如果子句中超过1000项就会报错. 这主要是oracle考虑性能问题做的限制.如果要 ...
- 动态SQL字符长度超过8000
动态SQL字符长度超过8000,我记得SQL SERVER 2008中用SP_EXECUTESQL打破了这个限制. 平常用动态SQL,可能都会用EXEC(),但是有限制,就是8000字符串长度.自从S ...
- sqlserver sp_executesql 动态SQL字符长度超过8000
动态SQL字符长度超过8000,我记得SQL SERVER 2005中用SP_EXECUTESQL打破了这个限制. 平常用动态SQL,可能都会用EXEC(),但是有限制,就是8000字符串长度.自从S ...
- sql查询in条件超过1000条解决方案
一. 背景: 小熙最近做的数据检索比较大,其中会使用到,in的条件会有超过1000条.但是in所支持的条件数量最多只有1000,那怎么办呢,后来小熙采取了分区检索,完成了. 二. 引入依赖: 引入ap ...
- Oracle1401和1438,Oracle SQL in 超过1000的解决方案
起因: 代码程序由于设计问题,采用了效率不太高的oracle 的in语句,当条件超过1000之后oracle会抛出ora-01795: 经过: 1,oracle中如果非要用in作为条件的话,超过100 ...
- Oracle数据库中IN参数个数超过1000的问题
问题描述:Oracle数据库中IN参数个数超过1000 遇到这种情况,想快速解决,数据库有 exists 关键字的话,可以用exists来代替 in 关键字. 数据库解决方法:可以拆分sql用 whe ...
- 如何解决请求URL长度超过配置的maxurlLength值问题
当我们批量请求的数据太多时,会出现请求的url长度超过配置maxurllength值的问题(比如一次性操作1000条数据) 1.问题描述: 我在进行批量选择单据进行发送时,出现这个问题(批量500条) ...
- Oracle数据库查询用 where in 查询的项超过1000条的解决方案
众所周知,如果我们的用SQL查询语句时,如果用where in带的参数超过1000条的话,oracle是会报错的. 因为项目中遇到这样的问题,所以找到了接下来我要说的这个办法. 因为用的地方很多,所以 ...
- 关于ORACLE 语句中,IN 超过1000个的解决方法
在ORACLE SELECT 语句中 IN 的数据如果超过 1000,就会出错,解决方法也很简单,以C#代码为例: 1.先写一个方法,接收2个参数 参数1:接收 IN里面的数据,如:'a1','a2' ...
最新文章
- blast程序 介绍 简介
- Android-JNINDK(一)入门
- 无法找到脚本库错误解决过程
- python列表使用技巧与方法_Python列表的相关操作与方法
- Js组件layer的使用
- Python Day 21 面向对象 (面向对象的三大特性(二)继承,多态,封装,几个装饰器函数)...
- MSP430程序库二UART异步串口
- java虚拟机时区_转:jvm设置时区问题
- 运算符优先级(图表)
- 电脑罗盘时钟html怎么设置成桌面,抖音时钟屏保怎么设置 罗盘时钟屏保设置方法...
- come的喂abc是什么梗
- 黑盒测试与白盒测试的区别
- element-UI 图标点击切换
- 邮箱发送材料服务器连接错误,发送邮件常见的错误和解决方法
- 头痛的apk卡顿,我该从哪些方面进行优化?带你了解常见方案
- HTML,JS与CSS
- Python3爬取国家统计局官网2019年全国所有城市(2020年更新)
- consistent hash
- 来给罗永浩和王自如打个分(下)
- typeScript 技术胖 笔记 下
热门文章
- oracle 新增配额,Oracle 用户配额
- linux使用磁盘配额,linux磁盘配额使用
- 微信群打卡小程序_微信群不好管理?这几款小程序帮你管理微信群
- 美国专利申请策略整理
- ps批量修改名片文字_教你用PS设计漂亮的名片
- 小程序跳转至企业微信客服wx.openCustomerServiceChat
- LittleVGL移植到STM32
- MybatisPlus中@TableField注解的使用详解
- 图形化开发(五)041-Three.js之Camera相机——target焦点和lookAt()方法、OrthographicCamera正交相机、PerspectiveCamera透视相机、相机插件
- 在计算机上OF键开机键,电脑开机时出现英文字母串需要按回车键才能继