fixed Oracle SQL报错 #ORA-01460: 转换请求无法实施或不合理
最近遇到一个oracle错误,之前并没有遇到过,并不是select in超过1000个导致的,通过网上资料说是oracle版本导致,也有的说是oracle SQL过长导致。
然后通过自己实践应该说是oracle SQL过长导致,看了一下SQL并不是很长,主要还是select in,因为主键换成uuid之后,来几百个uuid的数据,select in就导致SQL过长报错,我觉得网上所说的换oracle版本,也有可能是oracle版本对SQL过长支持不同。不过我还是通过改写业务SQL解决问题的。项目中也不可能随便就换oracle版本。
原来的代码,主要是select in 然后itemCode就是用;分隔的一大串的主键字符串,然后又换成uuid的了,所以导致sql过长
/**
* 获取信息模板
* @return
*/
private List<ApprSmsItemSettingVo> getSettingTemplate(String itemCode)
throws SQLException {
PreparedStatement pst = null;
StringBuffer sb = new StringBuffer();
sb.append("select a.itemCode, ");
sb.append("a.type, ");
sb.append("b.warn_days, ");
sb.append("c.proj_name, ");
sb.append("c.cust_name, ");
sb.append("a.is_send ");
sb.append("from t_item_setting a ");
sb.append("left join t_itm_define b on b.itemCode= a.itemCode ");
sb.append("b.itemCode where a.is_send in (1) and a.itemCode in (?) ");
pst = this.connection.prepareStatement(sb.toString());
pst.setString(1, itemCode);
ResultSet rs = pst.executeQuery();
List<ItemSettingVo> list = new ArrayList<ItemSettingVo>();
while(rs.next()){
ItemSettingVo vo = new ItemSettingVo();
vo.setItemCode(rs.getString("itemCode"));
vo.setType(rs.getLong("type"));
vo.setSmsTemplet(rs.getString("sms_templet"));
vo.setWarnDays(rs.getLong("warn_days"));
vo.setIsSend(rs.getLong("is_send"));
list.add(vo);
}
rs.close();
pst.close();
return list;
}
解决方法:用分组遍历再拼装为一个List的方法,这样就可以避免select in,然后in里面又是一大堆uuid的数据,然后就导致sql执行过长报错了
/**
* 获取信息模板
* fixed #ORA-01460: 转换请求无法实施或不合理
* ps:主键换成uuid之后,原来的方法会出现ORA-01460出错,sql太长导致
* @param itemCode
* @return
* @throws Exception
*/
public List<ItemSettingVo> getItemSettingVos(String itemCode)throws Exception{
List<ItemSettingVo> templateList = new ArrayList<ItemSettingVo>();
StringBuffer itmStr = new StringBuffer();
//XXX fixed Exception#ORA-01460: 转换请求无法实施或不合理 modify on 20190109
//暂时用分组遍历再拼装为一个List的方法,原来的方法放在getSettingTemplate
if(StringUtils.isNotBlank(itemCode)){
//itemCode = itemCode.replace("(", "").replace(")", "");
String[] itemCodeArr = StringUtils.split(itemCode,",");
int len = itemCodeArr.length;
if (len < 100) {//没超过100个事项编码的情况,按照原来的方法
templateList = this.getSettingTemplate(itemCode);
} else {//超过100个事项编码的情况,分组遍历,然后再拼装list,避免Exception#ORA-01460: 转换请求无法实施或不合理
List<Collection<String>> itms =CollectionUtils.splitCollection(Arrays.asList(itemCodeArr), 100);
for (Collection<String> colle: itms) {
for (String str : colle) {
itmStr.append("'").append(str).append("'").append(",");
}
itemCode = itmStr.toString().substring(0, itmStr.toString().length()-1);
templateList.addAll(this.getSmsSettingTemplate(itemCode));
itmStr.delete(0, itmStr.length());
}
System.out.println("get apprTemplateList:{}"+templateList.size());
}
}
return templateList;
}
集合拆分工具类,工具类复制公司同事写的代码
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class CollectionUtils {
public static List<Collection<String>> splitCollection(Collection<String>values , int size) {
List<Collection<String>> result = new ArrayList<Collection<String>>();
if(values.size() <= size ){
result.add(values);
}else{
int count =0;
Collection<String> subCollection= null;
for(String s:c){
if(subCollection == null){
subColletion = new ArrayList<String>();
result.add(subColletion);
}
subCollection.add(s);
count++;
if(count == size){
count =0;
subCollectiion = null;
}
}
}
}
}
fixed Oracle SQL报错 #ORA-01460: 转换请求无法实施或不合理的更多相关文章
- Oracle 12c报错:ORA-01078和LRM-00109的解决办法
Oracle 12c报错:ORA-01078和LRM-00109的解决办法 2017-12-17 10:25:30 lemon_love1 阅读数 4336 收藏 更多 分类专栏: oracle ...
- Oracle启动报错ORA-27102解决
环境:RHEL5.5 + Oracle 10.2.0.4 此错误一般是因为数据库的初始化参数文件的内存设置不当导致.本例是因为操作系统参数设置问题导致. 当前现象:Oracle启动报错ORA-2710 ...
- oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT
oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT 问题如下: SQL> conn scott/tiger@vm_database Connected to Oracle ...
- TNS-12532: TNS:invalid argument,Oracle的报错信息太让人无语
TNS-12532: TNS:invalid argument,Oracle的报错信息太让人无语 现象: Tnsping报错: [oracle@unicomGZ01 admin]$ ../../bin ...
- oracle 12c 报错 ora-03137 来自客户机的格式错误的TTC包被拒绝
昨天下午,实施报了一个oracle的报错ora-03137 说是数据库在11g时没有问题,升级到12c 时,就报错了. 本地调试,看到执行完sql后,报异常,如下: 把SqL在12c的数据库执行一下, ...
- oracle+mybatis报错:BindingException("Invalid bound statement (not found): ")
oracle+mybatis报错:BindingException("Invalid bound statement (not found): ") 从mysql转到oracle数 ...
- 利用sql报错帮助进行sql注入
我们可以利用sql报错帮助进行sql注入,这里以sql server 为例: sql查询时,若用group by子句时,该子句中的字段必须跟select 条件中的字段(非聚合函数)完全匹配,如果是se ...
- windows,oracle,dg报错:ORA-12528,ORA-12154,ORA-10456 ,PING[ARC1]: Heartbeat failed to connect to standby 'orclbk'. Error is 12154
windows,oracle,dg报错:ORA-12528,ORA-12154,ORA-10456 最近有需求在windows的2台oracle服务器上搭建dg,在过程中遇到了一些错误,跟在linux ...
- 数据库执行sql报错Got a packet bigger than 'max_allowed_packet' bytes及重启mysql
准备在mysql上使用数据库A,但mysql5经过重装后,上面的数据库已丢失,只得通过之前备份的A.sql重新生成数据库A. 1.执行sql报错 在执行A.sql的过程中,出现如下错误:Got a p ...
随机推荐
- 有关在Eclipse中安装STS(Spring Tool Suite)的若干问题总结
1.之前说明 在网上找了很多安装的方法,每次在线安装总会出现各种各样的问题,本地安装也是出现同样的问题(后来发现是下载的包有问题) 还有其他问题(忘记截图了,上图来自网络),大概就是这些各种各样的错误 ...
- Docker 容器连接
前面我们实现了通过网络端口类访问运行在 diocker 容器内的服务.下面我们来实现通过端口连接到了一个 dokcer 容器. 网络端口映射 我们创建一个python应用的容器. runoob@run ...
- selenium+java定位163/126邮箱元素显示定位失败解决
开始在没有进入iframe时,用任何方法定位163/126邮箱登录页面的元素都不可能定位到,eclipse工作台会显示Unable to locate element:…… 这种情况我遇到了两种原因: ...
- 【Mybatis】MyBatis之动态SQL(六)
MyBatis 的强大特性之一便是它的动态 SQL,本章介绍动态 SQL 查看本章,请先阅读[Mybatis]MyBatis对表执行CRUD操作(三). 本例表结构 CREATE TABLE `emp ...
- 移动端常见bug
meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=device-wid ...
- vue学习_01
一.什么是VUE 渐进式的前端框架,MVVM(Model,view,viewmodel)模式,饿了么用的就是vue框架 二.VUE基本语法 1.引入vue: <script src=" ...
- 如何安装ubuntu系统
https://www.cnblogs.com/Chinasf/archive/2010/05/06/1728840.html [Ubuntu 下挂ISO到虚拟光驱的方法] 各种方法参考如下论坛 ...
- SpringCloud-分布式配置中心(基于SpringBoot2.X)
一.配置中心的作用:可以将多种应用的配置进行集中式的管理,将这些配置统一存放到git或svn里面存储: 二.搭建SpringCloud-Config-Server 2.1如图后续步骤勾选Config ...
- EC20指令测试
cat /dev/ttyUSB2 & echo -e "AT+CGMM\r\n" >/dev/ttyUSB2 //输出模块型号 echo -e "AT+ ...
- android-音量管理
推荐简书夕月风: 前两个主要设计音频建设置流程. 一.https://www.jianshu.com/p/a48fc2c830da 二.https://www.jianshu.com/p/892761 ...