Oracle查数据并使用wm_concat函数拼接字段报错:缓冲区对于 CLOB 到 CHAR 转换或 BLOB 到 RAW 转换而言太小 (实际: 4763, 最大: 4000)
查询sql如下:
select (select to_char(wm_concat(a.description)) from project_report_detail a where project_report_id = t.id) as description2 , t.* from project_report t where 1=1 order by t.dept_id
然后由于project_report_detail 表的description字段是多条数据拼接成一个字段,拼接出来的结果字符串超过了sql的varchar2类型4000字符,所以报了此错:
缓冲区对于 CLOB 到 CHAR 转换或 BLOB 到 RAW 转换而言太小 (实际: 4763, 最大: 4000)
百度了一下找到了靠谱的解决办法,借鉴博客:http://www.linuxboy.net/linuxjc/137415.html
我的解决办法如下:查询的sql不再用to_char转成字符串,直接查出拼接字段的clob类型
select (select wm_concat(a.description) from project_report_detail a where project_report_id = t.id) as description2 , t.* from project_report t where 1=1 order by t.dept_id
然后在java中,用上面博客的方法处理成String类型:
private String ClobtoString(Clob clob){ String reString = ""; Reader is = null; try { is = clob.getCharacterStream(); } catch (Exception e) { e.printStackTrace(); } // 得到流 BufferedReader br = new BufferedReader(is); String s = null; try { s = br.readLine(); } catch (Exception e) { e.printStackTrace(); } StringBuffer sb = new StringBuffer(); while (s != null) { // 执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成STRING sb.append(s); try { s = br.readLine(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } reString = sb.toString(); return reString; }
成功解决,亲测有效
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本