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为例,介绍三种不同 ...
随机推荐
- Mac下PyCharm快捷键大全
Mac键盘符号和修饰键说明 ⌘ Command ⇧ Shift ⌥ Option ⌃ Control ↩︎ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭头 ...
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 避免使用终结器,避免大对象,避免复制缓冲区
避免使用终结器 如果没有必要,是不需要实现一个终结器(Finalizer).终结器的代码主要是让GC回收非托管资源用.它会在GC完成标记对象为可回收后,放入一个终结器队列里,在由另外一个线程执行队列里 ...
- kvm命令总结和虚机器备份迁移
管理kvm虚拟机命令 virsh uri: 查看当前主机上hypervisor的连接路径: virsh connect ...
- JS标签的各种事件的举例
1.鼠标单击事件( onclick ) <!DOCTYPE HTML> <html> <head> <meta http-equiv="Conten ...
- Codeforces103D - Time to Raid Cowavans
Portal Description 给出长度为\(n(n\leq3\times10^5)\)的序列\(\{a_n\}\),进行\(q(q\leq3\times10^5)\)次询问:给出\(x,y\) ...
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十)
前言 朋友们, 大家好,我还是Rector,写ASP.NET MVC 5系列文章[一步一步创建ASP.NET MVC5程序Repository+Autofac+Automapper+SqlSugar] ...
- 前端时间戳timestamp相关总结:
一.JavaScript获取当前时间戳的方法 第一种方法:var timestamp = Date.parse(new Date());结果:1280977330000 第二种方法:var times ...
- linux查看端口被占用等常用命令
一 根据端口号 查找对应的服务 比如我们查查找端口号8189对应的服务是哪个 1 先根据端口号查找对应对的pid(进程id)为23367 netstat -anp | grep 8189 ...
- linux 集群及lvs
集群及LVS 集群: 一组通过高速网络互联的计算机组,并以单一系统的模式加以管理 价格很多服务器集中起来,提供同一种服务,在客户端看起来就像只有一个服务器 可以在付出较低成本的情况下获得在性能,可靠性 ...
- java线程池技术(二): 核心ThreadPoolExecutor介绍
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程池技术属于比较"古老"而又比较基础的技术了,本篇博客主要作用是个人技术梳理,没什么新玩意. 一.Java线程池技术的 ...