Oracle数据库中in()参数超过一千报错代码报错
转载请注明出处:http://www.cnblogs.com/xunzhaorendaxia/p/8570604.html
解决方案将select * from tablename where field in(arg1,arg2...arg1001)拆成select * from tablename where field in(arg1,arg2...arg1000) or field in(arg1001);
本案例代码为项目中处理SQL语句中<#in>标签代替in (?,?,?..)的情况;
public class FeildTest {
public static void main(String[] args){
String sql = "select * from id<#in>";
int startSize = 21;
System.out.println(ExtractFeild(sql,startSize));
}
//标签替换
private static String ExtractFeild(String sql, int startSize) { String replaceTag = "<#in>";
if(sql.contains(replaceTag)){
String[] fields = sql.split(" ");
String field = "";
for (int i = 0; i < fields.length; i++) {
String str = fields[i];
if (str.contains(replaceTag)) {
if (str.equals(replaceTag)) {
field = fields[i-1];
break;
} else {
char[] fd = str.toCharArray();
char[] tags = replaceTag.toCharArray();
field = str.substring(0,KMP_Index(fd,tags));
break;
}
}
}
StringBuffer sb = new StringBuffer("("+field+" in(");
for (int i = 0; i < startSize/10; i++) {
for (int j = 0; j < 10; j++) {
sb.append("?,");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")");
if (startSize!=(i+1)*10) {
sb.append(" or ");
sb.append(field);
sb.append(" in( ");
}
}
for (int i = 0; i < startSize%10; i++) {
sb.append("?,");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")");
//额外的括号处理
sb.append(")"); //field<#in>之间空格兼容
String regex = field+"\\s*"+replaceTag;
sql = sql.replaceFirst(regex, sb.toString());
}
return sql;
}
//kmp特征向量
private static int[] next(char[] t) {
int[] next = new int[t.length];
next[0]=-1;
int i=0;
int j=-1;
while (i<t.length-1) {
if (j==-1||t[i]==t[j]) {
i++;
j++;
if (t[i]!=t[j]) {
next[i]=j;
} else {
next[i]=next[j];
}
} else {
j = next[j];
}
}
return next;
}
//KMP算法
private static int KMP_Index(char[] ss, char[] tt) {
int[] next = next(tt);
int i=0;
int j=0;
while ( i<=ss.length-1 && j<= tt.length -1) {
if (j==-1||ss[i]==tt[j]) {
i++;
j++;
} else {
j = next[j];
}
}
if (j<tt.length) {
return -1;
} else {
return i -tt.length;
}
}
}
其中用到了KMP算法来查找sql中该标签的位置,并作出处理计算出sql中<#in>标签个数;
其实算法逻辑结合网上资料很容易写出来;
不过在代码审查的过程中老大一眼就看出来个问题:
我原有SQL处理完想生成in (?,?,?,?..)or in (?,?,?..)这种结构
但是如果两边不加括号会存在逻辑上的错误;
比如我原计划select * from table where id in(1) or id in(2)and id=3;
是查不出来任何东西的;实际上会查出来select * from table where id in(1)的结果;这也是菜鸟程序员常见错误,
解决方案在处理此类SQL语句的时候多加()保证逻辑正确。
运行结果:
select * from (id in(?,?,?,?,?,?,?,?,?,?) or id in( ?,?,?,?,?,?,?,?,?,?) or id in( ?))
Oracle数据库中in()参数超过一千报错代码报错的更多相关文章
- Oracle数据库中字段定义为Char类型,Hibernate用该字段进行动态绑定参数查询,获取不到结果的问题
一.问题背景 产生环境:oracle数据库,hibernate操作 定义了一个表 create table STORE_INFORMATION ( id CHAR(32) not null, name ...
- Oracle数据库中调用Java类开发存储过程、函数的方法
Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日 浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...
- 【转】Oracle数据库中Sequence的用法
在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方. 1.Create Sequence (注释:你需要有CREATE S ...
- Oracle 数据库中日期时间的插入操作
Oracle 中如何插入日期时间类型的数据,首先为了演示, 新建数据表如下 create table t( mydate date); 插入日期时间 SQL> insert into t val ...
- Oracle GoldenGate中HANDLECOLLISIONS参数使用详解
Oracle GoldenGate中HANDLECOLLISIONS参数使用详解 HANDLECOLLISIONS 是一个 replicat 进程参数,主要在 initial load 中使用.在 ...
- 查找Oracle数据库中的重复记录
本文介绍了几种快速查找ORACLE数据库中的重复记录的方法. 下面以表table_name为例,介绍三种不同的方法来确定库表中重复的记录 方法1:利用分组函数查找表中的重复行:按照某个字段分组,找出行 ...
- Oracle数据库中插入日期型数据(to_date的用法)(转载)
往Oracle数据库中插入日期型数据(to_date的用法) INSERT INTO FLOOR VALUES ( to_date ( '2007-12-20 18:31:34' , 'YYY ...
- Oracle 数据库中查看表空间的2种方法
在Oracle数据库中查看表空间使用状况是我们在实际应用中经常涉及到的,以下的内容就就是对Oracle 数据库中查看表空间使用状况时所要用到的SQL的描述,希望你能从中获得自己想要的东西. Oracl ...
- oracle 数据库中(创建、解锁、授权、删除)用户
上文我们已经建立了名为orcl66的数据库. 想要在数据库中创建.修改用户需要我们以管理员权限登录到数据库中. 首先我们通过sqlplus命令登录连接数据库. 输入sqlplus命令--用户名: sy ...
- (面试题)如何查找Oracle数据库中的重复记录
今天做了个面试题:查找Oracle数据库中的重复记录,下面详细介绍其他方法(参考其他资料) 本文介绍了几种快速查找ORACLE数据库中的重复记录的方法. 下面以表table_name为例,介绍三种不同 ...
随机推荐
- NGUI的新手引导的实现
先声明一下,UNITY新手,如果说的有不对的地方,欢迎各位大神指正. 最近在项目需要实现新手引导,最基础的需求就是需要一个带黑色遮罩的引导UI,类似下图这种: 对,就是这么敷衍的UI,因为是我随手做的 ...
- explorer.exe 该文件没有与之关联的程序来执行该操作
删了点右键的东西搞出来的问题 其实就是关联出错了,解决:(新建一个temp.reg,内容如下,然后双击导入注册表即可) Windows Registry Editor Version 5.00 [[H ...
- Springmvc 中org.springframework.http.converter.json.MappingJackson2HttpMessageConverter依赖jackson包
1,问题详情:Spring使用4.3.5.Release版本后 在SpringMvc配置文件中配置json 解析器后出现报错信息 [org.springframework.web.context.Co ...
- React——diff算法
react的diff算法基于两个假设: 1.不同类型的元素会产生不同的树 2.通过设置key,开发者能够提示那些子组件是稳定的 diff算法 当比较两个树时,react首先会比较两个根节点,接下来具体 ...
- 决策树-C4.5算法(三)
在上述两篇的文章中主要讲述了决策树的基础,但是在实际的应用中经常用到C4.5算法,C4.5算法是以ID3算法为基础,他在ID3算法上做了如下的改进: 1) 用信息增益率来选择属性,克服了用信息增益选择 ...
- c# 委托(Func、Action)
以前自己写委托都用 delegate, 最近看组里的大佬们都用 Func , 以及 Action 来实现, 代码简洁了不少, 但是看得我晕晕乎乎. 花点时间研究一下,记录一下,以便后期的查阅. 1.F ...
- 在测试crontab执行脚本的时候,修改了linux的系统时间,crontab不执行了。
今天在写服务器的perl脚本的时候,在完成一版脚本打算通过crontab来测试一下呢,因为直接执行脚本文件是没有问题的,但是当配置到crontab定期执行时就会出现问题,到了指定的时间了,但是脚本文件 ...
- php程序员的成长之路
第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操作) 目标:能够完成基本的LNMP系统安装,简单配置维护:能够做基本的简单系统的php开发:能够在PHP中型系统中支 ...
- NLP︱高级词向量表达(二)——FastText(简述、学习笔记)
FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,不过这个项目其实是有两部分组成的,一部分是这篇文章介绍的 fastText 文本分类(paper: ...
- Hi3531 SDK v2.0.8.0 安装
1.Hi3531 SDK包位置 在"Hi3531_V100R001***/01.software/board"目录下,您可以看到一个 Hi3531_SDK_Vx.x.x.x.tgz ...