最近遇到一个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的方法,原来的方法放在getSettingTemplateif(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;}}}}
}

Oracle ORA-01460报错解决方法相关推荐

  1. oracle dbms_metadata,DBMS_METADATA报错解决方法

    我使用的Oracle的版本:10.2.01,DBMS_METADATA可以很方便地查询数据库对象的定义等相关信息.在使用DBMS_METADATA,遇到以下问题,总结如下. 1) SQL> co ...

  2. Oracle中wm_concat函数报错解决方法

    Oracle中wm_concat函数报错解决方法 参考文章: (1)Oracle中wm_concat函数报错解决方法 (2)https://www.cnblogs.com/52net/archive/ ...

  3. ThinkPad安装deepin操作系统报错解决方法

    ThinkPad安装deepin操作系统报错解决方法 参考文章: (1)ThinkPad安装deepin操作系统报错解决方法 (2)https://www.cnblogs.com/haihua85/p ...

  4. hive导出数据到本地文件报错解决方法

    hive导出数据到本地文件报错解决方法 参考文章: (1)hive导出数据到本地文件报错解决方法 (2)https://www.cnblogs.com/yaopeiyun/p/12232251.htm ...

  5. Failed to resolve: com.android.support:appcompat-v7:27.+ 报错解决方法

    Failed to resolve: com.android.support:appcompat-v7:27.+ 报错解决方法 参考文章: (1)Failed to resolve: com.andr ...

  6. AndroidStudio EventBus报错解决方法its super classes have no public methods with the @Subscribe

    AndroidStudio EventBus报错解决方法its super classes have no public methods with the @Subscribe 参考文章: (1)An ...

  7. @Data注解使用后get set报错解决方法

    @Data注解使用后get set报错解决方法 参考文章: (1)@Data注解使用后get set报错解决方法 (2)https://www.cnblogs.com/lijinshan950823/ ...

  8. 【PaddlePaddle系列】报错解决方法合集 (不定时更新)

    [PaddlePaddle系列]报错解决方法合集 (不定时更新) 参考文章: (1)[PaddlePaddle系列]报错解决方法合集 (不定时更新) (2)https://www.cnblogs.co ...

  9. vue 项目初始化时,npm run dev报错解决方法

    vue 项目初始化时,npm run dev报错解决方法 参考文章: (1)vue 项目初始化时,npm run dev报错解决方法 (2)https://www.cnblogs.com/ruilin ...

  10. Python 中文注释报错解决方法

    Python 中文注释报错解决方法 参考文章: (1)Python 中文注释报错解决方法 (2)https://www.cnblogs.com/cjiong/p/5881983.html 备忘一下.

最新文章

  1. JavaScript:事件冒泡和事件委托
  2. TEE Internal core API介绍(globalplatform)
  3. 一定要搜藏的20个非常有用的PHP类库
  4. Android安卓模拟器的使用
  5. Kotlin 和Spring WebFlux
  6. MangosCfg文件中文说明
  7. 【学习笔记】网络层——IPv6:地址表示、IPv4的对比、IPv4过渡到IPv6、基本地址类型等
  8. ecshop category.php?id=4,categoryall.php
  9. 单片机r6/r7c语言怎么用,关于单片机C51中c语言函数(-nop-())?
  10. pdf怎么设置密码?
  11. Java编码规范总结(腾讯+阿里)
  12. 测度论与概率论基础学习笔记6——2.4可测函数的收敛性
  13. MSOCache是什么?
  14. Java版俄罗斯方块
  15. das dsadsa
  16. 世界500强公司要求员工必须熟练掌握的七种工作方法
  17. GST: Grouped Spatial-Temporal Aggregation for Efficient Action Recognition 论文阅读
  18. AlphaFold2源码解析(10)--补充信息1(residue_constants)
  19. nacos2.X集群错误:com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception
  20. 家庭和办公路由器被劫持以发动DDoS攻击

热门文章

  1. 技术专题:为什么宽带可以双拨号?双拨以后一定有两倍的流量吗?
  2. python下的一个好用的日历库,支持农历和公历互转,四柱反查等功能
  3. Lightswitch中使用LINQ
  4. 第四课:如何安装树莓派系统
  5. 光纤数据采集板资料:基于5VFX70T的3U VPX 光纤数据采集存储板218
  6. 定义函数:判断一个数是否为素数,并调用
  7. python七巧板绘图_记录一次canvas绘图(七巧板)
  8. uniapp从开发App到上架应用市场需要经历什么?
  9. 支持华为鸿蒙2.0的手机型号是,华为鸿蒙2.0系统支持的手机型号 华为鸿蒙2.0系统详解...
  10. vue 全局监听浏览器窗口关闭以及无痕模式场景提示