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 的解决方案相关推荐

  1. Oracle1401和1438,Oracle SQL in 超过1000的解决方案

    起因: 代码程序由于设计问题,采用了效率不太高的oracle 的in语句,当条件超过1000之后oracle会抛出ora-01795: 经过: 1,oracle中如果非要用in作为条件的话,超过100 ...

  2. 处理 Oracle SQL in 超过1000 的解决方案

    处理oracle sql 语句in子句中(where id in (1, 2, ..., 1000, 1001)),如果子句中超过1000项就会报错. 这主要是oracle考虑性能问题做的限制.如果要 ...

  3. Oracle编程入门经典 第9章 掌握SQL*Plus

    目录 9.1             高级启动选项... 1 9.1.1         LOGON.. 2 9.1.2         设置描述文件... 2 9.1.3         START ...

  4. Oracle 数据库中较为复杂或典型的 SQL 语句的解读

    文章目录 批量生成 SQL 语句/拼接字符串 多表关联查询 + where 子句 示例(一) 示例(二) 普通的表间内连接查询语句 关键字 distinct 用法说明 Oracle 数据库的分组排序查 ...

  5. oracle 9i 手工建库,简单记录Oracle 9i数据库手工建库过程

    简单记录Oracle 9i数据库手工建库过程Oracle 9i手工建库 By Oracle老菜 今天客户要用oracle 9.2.0.5,aix 6.1已经不支持了,只好从别的数据库把软件拷贝过来重编 ...

  6. sql server 2008连接oracle操作步骤详细记录,SQLServer连接Oracle详细步骤

    我们知道SQL Server和Oracle其实很多原理都类似.特别是一些常用的SQL语句都是按照标准来.所以它们也可以有一定的互操作性的.这里 我们知道SQL Server和Oracle其实很多原理都 ...

  7. oracle官网能用的账号,oracle 官方登录账号Oracle的在windows下的安装及使用

    一:官网下载oracle数据库 这里我下载的是oracle 11g r2,根据自己的操作系统选择相应的下载文件,我这里是windows 64位的,所以选择第二个,点击see all 点击accept ...

  8. oracle server process,KI视角下的ORACLE SERVER PROCESS进程的活动

    1.Server Process oracle的服务进程也称为shadow进程,主要是用于响应客户端请求执行相关的SQL语句,该进程运行的效率会对oracle的客户端的操作人员的体验产生很大的影响,o ...

  9. oracle双机切换 无法挂载,Linux下Oracle RAC一个节点宕机导致共享存储无法挂载的故障排除...

    环境:两台HP ML570 Linux AS4.5 Oracle 10g两台Server做了Oracle的RAC,通过SAN Switch连接到HP MSA1000故障现象:因为其中一个Ora 环境: ...

最新文章

  1. 基于移动位置服务器,移动定位服务器的设计与实现
  2. PyCharm没有run选项,只有run nosetests in XXX
  3. PHP的postman的bulk edit小功能:可以直接复制浏览器query string parameters的数据至postman的body的form-data 很方便 不用手写了
  4. 智能指针——weak_ptr
  5. Rtworld防洪系统全解开源完整源码
  6. Linux常用命令笔记2---文件管理2
  7. 【js】event(事件对象)详解
  8. java 自定义注解 生成json_Java使用@JsonDeserialize注解实现自定义反序列化器
  9. 1.Chrome开发者工具不完全指南(一、基础功能篇)
  10. php俄语包,俄语资源汇总 - 俄语 | Russian | Pусский - 声同小语种论坛 - Powered by phpwind...
  11. Mstar 平台(648)唤醒之串口唤醒
  12. python下一代工作流引擎_几大工作流引擎对比
  13. MATLAB - 旋度可视化
  14. 图解PKCS#1——第五部分 附录Mask generation functions MGF1
  15. error: server certificate verification failed 问题
  16. 用计算机的拓展活动总结,计算机学院心理健康节素质拓展活动圆满结束
  17. MySql now函数
  18. 惊闻苏州GDP总量突破2万亿大关!
  19. iOS-Xcode Archive 不生成dsym文件的解决方法
  20. Xmind思维导图编写测试点,便于扩展测试用例(详细)

热门文章

  1. 如何正确的创建和销毁Java对象
  2. 每日一皮:在调试时,将断点设置在错误的位置...
  3. 每日一皮:都 0202 年了,我怎么可能被骗呢?
  4. 它来了:阿里巴巴Java开发手册泰山版解读
  5. 这8种经常被忽视的SQL错误用法,你踩过几个?
  6. 自律到极致-人生才精致:第2期
  7. 一文学会Maven的版本发布
  8. linux+取消磁盘阵列,Linux下彻底关闭某个RAID磁盘阵列
  9. 永久代内存java_Java8内存模型—永久代(PermGen)和元空间(Metaspace)
  10. 采用全文索引解决模糊查询速度慢的问题