`
zhangjim
  • 浏览: 51547 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle数据库中IN参数个数超过1000的问题

阅读更多

业务问题:

 在oracle中,我们使用in方法查询记录的时候,如果in后面的参数个数超过1000个,那么会发生错误,JDBC会抛出“java.sql.SQLException: ORA-01795: 列表中的最大表达式数为 1000”这个异常。

 

解决方案:

这个问题的思想是把参数列表分段,将SQL语句拼成如下形式:

select * from spp_info where keyword in (a,b,c) union select * from spp_info where keyword in (d,e,f)

public class Test {
	public static void main(String[] args) {
		String sql = "select * from spp_info where keyword";
		String keyword = "a,b,c,d,e,f";
		int splitNum = 3;
		System.out.println(setWhereInArray(sql, keyword, splitNum));
	}

	/**
	 * More than 1000 divided into multiple sql queries
	 * 
	 * @param orgSql
	 * @param paramValue
	 * @param splitNum query number
	 * @return sql
	 */
	public static String setWhereInArray(String orgSql, String paramValue, int splitNum) {
		String paramArray[] = paramValue.split(",");
		int inArrayNum = paramArray.length % splitNum == 0 ? paramArray.length / splitNum : paramArray.length / splitNum + 1;

		int m = 0;
		int b = 0;
		int n = splitNum;
		String p[] = new String[inArrayNum];
		String sql[] = new String[inArrayNum];

		for (int k = 0; k < paramArray.length; k++) {
			if (b < inArrayNum) {
				p[b] = "";
				for (; m < n; m++) {
					if (m >= paramArray.length) {
						break;
					}
					p[b] += paramArray[m] + ",";
				}
				p[b] = p[b].substring(0, p[b].lastIndexOf(","));
				sql[b] = orgSql + " in (" + p[b] + ")";
				b++;
				n += splitNum;
			}
		}
		String newSql = "";
		for (int q = 0; q < sql.length; q++) {
			newSql += sql[q] + " union ";
		}
		newSql = newSql.substring(0, newSql.lastIndexOf(" union "));
		return newSql;
	}
}

 

 

2
1
分享到:
评论
5 楼 zhangjim 2013-11-09  
没办法啊,in里面的关键词是随机个数的
4 楼 logqq 2013-11-05  
LZ 霸气啊 。。IN 后面的参数能用到这么多?
3 楼 houyujiangjun 2013-11-04  
也就是oracle 让你这么瞎搞,你用用mysql,百万计,十个以上的in 不跑个几分钟出来才怪。。。。
2 楼 icefishc 2013-11-04  
这么多东西你就不该用in了
1 楼 capp0139 2013-11-04  
截取1000个in 条件中间用 or 就行了,不需要union

相关推荐

    Oracle数据库管理员技术指南

    第1章 建立和配置数据库 1.1 数据库创建规划 1.1.1 规划以及提出正确的问题 1.1.2 怎样确定恰当的数据块尺寸 1.2 组织文件系统 1.2.1 怎样命名数据库文件 1.2.2 使用最佳灵活结构 1.2.3 怎样配置符合 OFA 的 ...

    操作系统重装后oracle数据库的恢复

    a、oracle数据库系统变量的恢复,ora.reg中饱含了oracle的主要系统参数,其中home项包含了不同的版本信息,导入注册表后可以根据情况修改、增加或者删除对应的home信息。 b、oracle odbc驱动参数的恢复,需要导入...

    Object Browser7.0中文版(ORACLE数据库的开发工具)

    公司设计制造的一个全面支持ORACLE数据库的开发工具.凭借着卓越的性能及超群的用户友好性,Object&nbsp;Browser在日本市场上创出了非常好的销售业绩,在过去三年中,每个月都创下新的销售记录.到目前为止,该产品...

    oracle数据库经典题目

    18. 表空间是Oracle数据库中数据的逻辑组织,每个数据库至少有一个SYSTEM系统表空间。 19.视图是一个表示表的数据的数据库对象,它允许用户从一个表或一组表中通过一定的查询语句建立一个“虚表”。 20.序列是一种...

    ORACLE数据库智能化管理系统2012

    ORACLE数据库智能化管理系统2012 软件介绍 序言 ORACLE数据库管理们: 你们还在为处理日常大量数据,天天写过多的SQL语句而烦恼吗? 还在为由于没有面面具到的软件来汇制想要的日常数据报表而烦恼吗? 还在为查找...

    Oracle数据库中物化视图的原理剖析

    在 10g 中,新的 DBMS_ADVISOR 程序包中的一个名为 TUNE_MVIEW 的过程使得这项工作变得非常容易:您利用 IN 参数来调用程序包,这构造了物化视图创建脚本的全部内容。该过程创建一个顾问程序任务 (Advisor Task),它...

    21天学通Oracle

    8.2.3 存储过程的参数——IN参数 146 8.2.4 存储过程的参数——OUT参数 147 8.2.5 存储过程的参数——IN OUT参数 149 8.2.6 存储过程的参数——参数顺序 149 8.2.7 存储过程的参数——参数的默认值 152 8.2.8 ...

    oracle实验报告

    Oracle数据库自带的几个触发器(最简单触发器格式)示例如下: -- create or replace trigger MDSYS.sdo_drop_user after drop on DATABASE declare stmt varchar2(200); BEGIN if dictionary_obj_type = 'USER...

    Oracle9i的init.ora参数中文说明

    随每个平台附带的特有的 make 文件中包含此参数的默认值。如果为此参数指定了一个值, 则该值将覆盖 make 文件中的默认值。 值范围: 链接程序的完整路径名。 默认值: 无 plsql_native_make_file_name: 说明: 指定 ...

    ORACLE,mysql,sqlserver,sybase数据库装文本软件

    自己写的数据库装载工具,平时工作中用于装载大文本文件到数据库表,也能直接装载excel,不过excel只能使用第一个sheet,且不支持合并的单元格。 jdk要求版本1.6及以上。 使用方法: java -jar lynload.jar,即可看到...

    Oracle8i_9i数据库基础

    第一章 Oracle数据库基础 23 §1.1 理解关系数据库系统(RDBMS) 23 §1.1.1 关系模型 23 §1.1.2 Codd十二法则 24 §1.2 关系数据库系统(RDBMS)的组成 24 §1.2.1 RDBMS 内核 24 §1.2.2 数据字典概念 25 §1.3 ...

    oracle存储过程

    存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。 定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL Server)。如果我们通过创建存储...

    Oracle P/L SQL实现FTP上传、下载功能

    Oracle P/L SQL实现FTP上传、下载功能,以下是此过程包的头部,包体经常打包处理plb,感兴趣用户可以下载下来。 --Oracle上的FTP功能 Create or Replace Package UTL_FTP AUTHID CURRENT_USER as Type Connection ...

    ORACLE9i_优化设计与系统调整

    §1.1 Oracle数据库结构 23 §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1 数据文件 26 §1.2.2 控制文件 26 §1.2.3 重做日志文件 26 §...

    Linux系统下Oracle数据库的安装和启动关闭操作教程

    1.准备: df -H  查看空间剩余 一般准备最少5G 2.查看swap分区大小 ...4. 设置参数 su - oracle vi .bash_profile export ORACLE_BASE=/u01/oracle export ORACLE_HOME=$ORACLE_BASE/10g e

    ORACLE_SP解析不定个参数

    实际开发中,SP需要接收未知个参数,然后使用in 或not in 等方法检索数据库,故写了此方案解决该问题

    使用ef6创建oracle数据库的实体模型遇到的问题及解决方案

    解决方案中的数据层项目最初使用的是oracle 11g + ef5 创建的实体模型,在分页时遇到了skip参数为0报错的问题,没有找到相关资料。 于是决定升级到ef6,在oracle官网中得知,Oracle Data Provider for .NET in ODAC ...

    深入解析Oracle.DBA入门进阶与诊断案例

    2.4.4 Oracle数据库的引导 91 2.4.5 系统对象与bootstrap$ 92 2.4.6 bootstrap$的重要性 94 2.4.7 BBED工具的简要介绍 95 2.4.8 坏块的处理与恢复 97 第3章 参数及参数文件 103 3.1 初始化参数的分类...

Global site tag (gtag.js) - Google Analytics