oracle的in的值超过3000,处理 Oracle SQL in 超过1000 的解决方案
http://www.cnblogs.com/hoojo/archive/2012/08/31/2665396.html hoojo的这篇博文里面,介绍了处理Oracle SQL in超过1000的解决办法,但这种方式目前只适合字符类型的数据 因为Oracle在处理,in 查询时,如果字段是varchar2类型的,in表达式是这样('','')书写的,如果是number类型的,是in(1,2,3),如果把number类型的写成in('1','2')这种,在查询时,oracle会自动进行强制转换的,这就有可能改变执行计划了 关于Oracle中的显式类型转换(Explicit)和自动类型转换(隐式类型转换Implicit)两种方式的解说请看下面的博文 http://www.itpub.net/forum.php?mod=viewthread&tid=1303566
改进完善后的代码,供参考
/**
* function: 处理oracle sql 语句in子句中(where id in (1, 2, ..., 1000, 1001)),
* 如果子句中超过1000项就会报错。
* 这主要是oracle考虑性能问题做的限制。
* 如果要解决次问题,可以用 where id (1, 2, ..., 1000) or id (1001, ...)
* @param vals in语句中的集合对象
* @param type S=字符类型的,N=数值类型的
* @param field in语句对应的数据库查询字段
* @return 返回 field in (...) or field in (...) 字符串
*/
public static String getOracleSQLIn(List> vals, String type, String field) {
if(Common.isEmpty(vals)) return field + " in ('')";
int count = vals.size();//获取集合的长度
count = Math.min(count, 1000);//判断集合长度是否小于1000
int len = vals.size();
int size = len % count;
if (size == 0) {
size = len / count;
} else {
size = (len / count) + 1;
}
StringBuilder builder = new StringBuilder();
if("S".equals(type)) {
for (int i = 0; i < size; i++) {
int fromIndex = i * count;
int toIndex = Math.min(fromIndex + count, len);
String val = StringUtils.defaultIfEmpty(StringUtils.join(vals.subList(fromIndex, toIndex), "','"), "");
if (i != 0) {
builder.append(" or ");
}
builder.append(field).append(" in ('").append(val).append("')");
}
} else {
for (int i = 0; i < size; i++) {
int fromIndex = i * count;
int toIndex = Math.min(fromIndex + count, len);
String val = StringUtils.defaultIfEmpty(StringUtils.join(vals.subList(fromIndex, toIndex), ","), "");
if (i != 0) {
builder.append(" or ");
}
builder.append(field).append(" in (").append(val).append(")");
}
}
return StringUtils.defaultIfEmpty(builder.toString(), field + " in ('')");
}
oracle的in的值超过3000,处理 Oracle SQL in 超过1000 的解决方案相关推荐
- Oracle1401和1438,Oracle SQL in 超过1000的解决方案
起因: 代码程序由于设计问题,采用了效率不太高的oracle 的in语句,当条件超过1000之后oracle会抛出ora-01795: 经过: 1,oracle中如果非要用in作为条件的话,超过100 ...
- 处理 Oracle SQL in 超过1000 的解决方案
处理oracle sql 语句in子句中(where id in (1, 2, ..., 1000, 1001)),如果子句中超过1000项就会报错. 这主要是oracle考虑性能问题做的限制.如果要 ...
- Oracle编程入门经典 第9章 掌握SQL*Plus
目录 9.1 高级启动选项... 1 9.1.1 LOGON.. 2 9.1.2 设置描述文件... 2 9.1.3 START ...
- Oracle 数据库中较为复杂或典型的 SQL 语句的解读
文章目录 批量生成 SQL 语句/拼接字符串 多表关联查询 + where 子句 示例(一) 示例(二) 普通的表间内连接查询语句 关键字 distinct 用法说明 Oracle 数据库的分组排序查 ...
- oracle 9i 手工建库,简单记录Oracle 9i数据库手工建库过程
简单记录Oracle 9i数据库手工建库过程Oracle 9i手工建库 By Oracle老菜 今天客户要用oracle 9.2.0.5,aix 6.1已经不支持了,只好从别的数据库把软件拷贝过来重编 ...
- sql server 2008连接oracle操作步骤详细记录,SQLServer连接Oracle详细步骤
我们知道SQL Server和Oracle其实很多原理都类似.特别是一些常用的SQL语句都是按照标准来.所以它们也可以有一定的互操作性的.这里 我们知道SQL Server和Oracle其实很多原理都 ...
- oracle官网能用的账号,oracle 官方登录账号Oracle的在windows下的安装及使用
一:官网下载oracle数据库 这里我下载的是oracle 11g r2,根据自己的操作系统选择相应的下载文件,我这里是windows 64位的,所以选择第二个,点击see all 点击accept ...
- oracle server process,KI视角下的ORACLE SERVER PROCESS进程的活动
1.Server Process oracle的服务进程也称为shadow进程,主要是用于响应客户端请求执行相关的SQL语句,该进程运行的效率会对oracle的客户端的操作人员的体验产生很大的影响,o ...
- oracle双机切换 无法挂载,Linux下Oracle RAC一个节点宕机导致共享存储无法挂载的故障排除...
环境:两台HP ML570 Linux AS4.5 Oracle 10g两台Server做了Oracle的RAC,通过SAN Switch连接到HP MSA1000故障现象:因为其中一个Ora 环境: ...
最新文章
- 基于移动位置服务器,移动定位服务器的设计与实现
- PyCharm没有run选项,只有run nosetests in XXX
- PHP的postman的bulk edit小功能:可以直接复制浏览器query string parameters的数据至postman的body的form-data 很方便 不用手写了
- 智能指针——weak_ptr
- Rtworld防洪系统全解开源完整源码
- Linux常用命令笔记2---文件管理2
- 【js】event(事件对象)详解
- java 自定义注解 生成json_Java使用@JsonDeserialize注解实现自定义反序列化器
- 1.Chrome开发者工具不完全指南(一、基础功能篇)
- php俄语包,俄语资源汇总 - 俄语 | Russian | Pусский - 声同小语种论坛 - Powered by phpwind...
- Mstar 平台(648)唤醒之串口唤醒
- python下一代工作流引擎_几大工作流引擎对比
- MATLAB - 旋度可视化
- 图解PKCS#1——第五部分 附录Mask generation functions MGF1
- error: server certificate verification failed 问题
- 用计算机的拓展活动总结,计算机学院心理健康节素质拓展活动圆满结束
- MySql now函数
- 惊闻苏州GDP总量突破2万亿大关!
- iOS-Xcode Archive 不生成dsym文件的解决方法
- Xmind思维导图编写测试点,便于扩展测试用例(详细)
热门文章
- 如何正确的创建和销毁Java对象
- 每日一皮:在调试时,将断点设置在错误的位置...
- 每日一皮:都 0202 年了,我怎么可能被骗呢?
- 它来了:阿里巴巴Java开发手册泰山版解读
- 这8种经常被忽视的SQL错误用法,你踩过几个?
- 自律到极致-人生才精致:第2期
- 一文学会Maven的版本发布
- linux+取消磁盘阵列,Linux下彻底关闭某个RAID磁盘阵列
- 永久代内存java_Java8内存模型—永久代(PermGen)和元空间(Metaspace)
- 采用全文索引解决模糊查询速度慢的问题