转载请注明出处: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()参数超过一千报错代码报错的更多相关文章

  1. Oracle数据库中字段定义为Char类型,Hibernate用该字段进行动态绑定参数查询,获取不到结果的问题

    一.问题背景 产生环境:oracle数据库,hibernate操作 定义了一个表 create table STORE_INFORMATION ( id CHAR(32) not null, name ...

  2. Oracle数据库中调用Java类开发存储过程、函数的方法

    Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...

  3. 【转】Oracle数据库中Sequence的用法

    在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方. 1.Create Sequence (注释:你需要有CREATE S ...

  4. Oracle 数据库中日期时间的插入操作

    Oracle 中如何插入日期时间类型的数据,首先为了演示, 新建数据表如下 create table t( mydate date); 插入日期时间 SQL> insert into t val ...

  5. Oracle GoldenGate中HANDLECOLLISIONS参数使用详解

    Oracle GoldenGate中HANDLECOLLISIONS参数使用详解   HANDLECOLLISIONS 是一个 replicat 进程参数,主要在 initial load 中使用.在 ...

  6. 查找Oracle数据库中的重复记录

    本文介绍了几种快速查找ORACLE数据库中的重复记录的方法. 下面以表table_name为例,介绍三种不同的方法来确定库表中重复的记录 方法1:利用分组函数查找表中的重复行:按照某个字段分组,找出行 ...

  7. Oracle数据库中插入日期型数据(to_date的用法)(转载)

    往Oracle数据库中插入日期型数据(to_date的用法) INSERT  INTO  FLOOR  VALUES  ( to_date ( '2007-12-20 18:31:34' , 'YYY ...

  8. Oracle 数据库中查看表空间的2种方法

    在Oracle数据库中查看表空间使用状况是我们在实际应用中经常涉及到的,以下的内容就就是对Oracle 数据库中查看表空间使用状况时所要用到的SQL的描述,希望你能从中获得自己想要的东西. Oracl ...

  9. oracle 数据库中(创建、解锁、授权、删除)用户

    上文我们已经建立了名为orcl66的数据库. 想要在数据库中创建.修改用户需要我们以管理员权限登录到数据库中. 首先我们通过sqlplus命令登录连接数据库. 输入sqlplus命令--用户名: sy ...

  10. (面试题)如何查找Oracle数据库中的重复记录

    今天做了个面试题:查找Oracle数据库中的重复记录,下面详细介绍其他方法(参考其他资料) 本文介绍了几种快速查找ORACLE数据库中的重复记录的方法. 下面以表table_name为例,介绍三种不同 ...

随机推荐

  1. [Codeforces]817F. MEX Queries 离散化+线段树维护

    [Codeforces]817F. MEX Queries You are given a set of integer numbers, initially it is empty. You sho ...

  2. vue 路由懒加载 使用,优化对比

    vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,时间过长,会出啊先长时间的白屏,即使做了loading也是不利于用户体验,而运 ...

  3. header 头各种类型文件下载

    function down_file($url,$type='application/zip'){     header("Cache-Control: public");     ...

  4. Java经典编程题50道之三十七

    有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位. public class Example37 { public static v ...

  5. Hibernate学习(一)创建数据表

    (1)生成数据库表的创建: // 默认读取hibernate.cfg.xml文件 Configuration cfg = new Configuration().configure(); // 生成并 ...

  6. Java进阶之路——从初级程序员到架构师,从小工到专家

    原创文章 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作三五年之后开始迷茫的老程序员经常会问到 ...

  7. MyCat 读写分离,负载均衡

    docker mysql 主从复制 配合Spring 事务 注意事项 配置好JRE,安装好MYCAT 在mysql主库创建表,会同步到从库 CREATE TABLE `user` ( `id` ) N ...

  8. linux dhcp 设置路由及主机名

    自动获取ipDHCP方式获取ip:dhclient [网络接口]释放通过DHCP获取的ip地址:dhclient -r [网络接口]查看网络接口 ifconfig -a(列出所有接口含禁用的) eth ...

  9. Pokémon Go呼应设计:让全世界玩家疯狂沉迷

    引言:什么样的呼应设计会让移动游戏玩家沉迷?那必须为玩家构建一个属于玩家本人或者被玩家认可的虚拟环境,或者说是被玩家认可的虚拟世界.在移动游戏时代,想要做到这一点并不容易.但Pokémon Go却做到 ...

  10. 图像处理------基于Otsu阈值二值化

    一:基本原理 该方法是图像二值化处理常见方法之一,在Matlab与OpenCV中均有实现. Otsu Threshing方法是一种基于寻找合适阈值实现二值化的方法,其最重 要的部分是寻找图像二值化阈值 ...