无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 2137|回复: 13
打印 上一主题 下一主题

[分享] 费了一晚上才解决的oracle数据库提示ORA-01489字符串连接的结果过长

  [复制链接]
跳转到指定楼层
1#
发表于 2025-4-4 23:36:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 likeyouli 于 2025-4-4 23:37 编辑

首先说明,字符串肯定没有过长,最多估计都不到100,但递归查询时就是提示错误,见图,代码如下:with jichu as (select shfzhm,yyxmmc,tcje,fyfssj,row_number() over(partition by shfzhm order by fyfssj) as rn from tanghua  where ybxmmc like '%糖化血红蛋白%') ,
digui (shfzhm,yyxmmc,tcje,fyfssj,rn,所有日期) as (
select jichu.*,to_char(jichu.fyfssj,'yyyy-mm-dd') as 所有日期 from jichu  where rn=1
union all
select jichu.shfzhm,jichu.yyxmmc,jichu.tcje,jichu.fyfssj,jichu.rn,  (to_char(jichu.fyfssj,'yyyy-mm-dd') || '>>' ||所有日期)    as 所有日期
from jichu join digui on jichu.shfzhm=digui.shfzhm and jichu.rn=digui.rn+1
)
select * from digui

解决方式见二楼,,高手误嘲笑,实在费了洋劲才解决的,各种百度,deepseek都白搭,偶然测试才发现解决方式,看样子我对oracle数据库的底层了解太浅了,到现在都没明白咋回事,估计to_char转换完是不是有字节大小限制啊, 算了,以后慢慢思考原理.  现心情舒畅的必须向无忧网友报告一下,有遇到同样问题的可参考解决,

..png (41.28 KB, 下载次数: 41)

..png

点评

谢谢大佬,记得有个图形化的SQL语句设计器,一步步下去,最后给结果。复杂的sql语句还是很麻烦的,如果不能用中间临时表的话。  发表于 2025-4-5 19:12

评分

参与人数 2无忧币 +6 收起 理由
waltz1 + 1 很棒的优化语句
sunsea + 5 很给力!

查看全部评分

2#
 楼主| 发表于 2025-4-4 23:36:41 | 只看该作者
本帖最后由 likeyouli 于 2025-12-11 17:15 编辑

解决代码:with jichu as (select shfzhm,yyxmmc,tcje,fyfssj,row_number() over(partition by shfzhm order by fyfssj) as rn from tanghua  where ybxmmc like '%糖化血红蛋白%') ,
digui (shfzhm,yyxmmc,tcje,fyfssj,rn,所有日期) as (
select jichu.*,cast(to_char(jichu.fyfssj,'yyyy-mm-dd') as varchar2(4000)) as 所有日期 from jichu  where rn=1
union all
select jichu.shfzhm,jichu.yyxmmc,jichu.tcje,jichu.fyfssj,jichu.rn,  (to_char(jichu.fyfssj,'yyyy-mm-dd') || '>>' ||所有日期)    as 所有日期
from jichu join digui on jichu.shfzhm=digui.shfzhm and jichu.rn=digui.rn+1
)
select * from digui order by shfzhm,fyfssj

即 to_char转换为字符串后,再cast一下所有日期这列才可以, 感觉所有日期这列有点相当于变量, cast as varchar2(4000) 这样就没问题了, 这么简单的问题, 为啥百度,deepseek就解决不了呢?
是问的方式不对,还是怎么回事  ?? 老让我转to_clob,转完又报什么错误, 关键是根本就不需要转,最长的字符也不长  .
    再说句, 这两天光研究递归查询了, 总算有点明白了  
-------------------------------------------------------------------------------------------------------------
又研究了, 貌似不用cast也可以不出问题,见引用  :
--再练习一下我最讨厌的递归查询,先练习糖化血红蛋白小于90天违规的问题吧
with jichu as (select e2.jshid,e2.shfzhm,e2.xm,yyxmmc,zje,tcje,fyfssj,row_number() over(partition by e2.shfzhm order by fyfssj) rn
from eryuan join yb_jszd_ws e2 on eryuan.jshid=e2.jshid where yyxmmc like '糖化血红蛋白%'),
digui(jshid,shfzhm,xm,yyxmmc,zje,tcje,fyfssj,rn,canzhaoriqi,beizhu,违规金额,所有日期) as (
select jichu.*,fyfssj as canzhaoriqi,'首次' as beizhu,0 as 违规金额,
to_char(fyfssj,'yyyy-mm-dd')  as 所有日期 from jichu where rn=1
union all
select jichu.jshid,jichu.shfzhm,jichu.xm,jichu.yyxmmc,jichu.zje,jichu.tcje,jichu.fyfssj,jichu.rn,
case when jichu.fyfssj-digui.canzhaoriqi>90 then jichu.fyfssj else digui.canzhaoriqi end as canzhaoriqi,
case when jichu.fyfssj-digui.canzhaoriqi>90 then '新的首次' else '非首次非新的首次' end as beizhu,
case when jichu.fyfssj-digui.canzhaoriqi>90 then 0 else jichu.tcje end as 违规金额,
  (to_char(jichu.fyfssj,'yyyy-mm-dd') || '>>' || digui.所有日期) as 所有日期 from jichu
join digui on jichu.shfzhm=digui.shfzhm and jichu.rn=digui.rn+1
)
select digui.*,fyfssj-canzhaoriqi 相差几天 from digui order by shfzhm,rn

..png (73.89 KB, 下载次数: 39)

..png

..png (72.61 KB, 下载次数: 1)

..png

点评

很棒的实践  发表于 2025-4-5 19:13
回复

使用道具 举报

3#
发表于 2025-4-5 00:01:38 | 只看该作者
满满的经验 学习了
回复

使用道具 举报

4#
发表于 2025-4-5 06:04:59 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

5#
发表于 2025-4-5 07:32:48 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

6#
发表于 2025-4-5 07:59:51 | 只看该作者
谢谢分享经验
回复

使用道具 举报

7#
发表于 2025-4-5 09:56:34 | 只看该作者
字都认识
膜拜了
回复

使用道具 举报

8#
发表于 2025-4-5 10:43:43 | 只看该作者
这是医院的数据库???楼主666啊,无忧真是藏龙卧虎啊。。
回复

使用道具 举报

9#
发表于 2025-4-5 11:16:17 | 只看该作者
谢谢分享
回复

使用道具 举报

10#
发表于 2025-4-5 12:14:01 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

11#
发表于 2025-4-5 12:44:14 | 只看该作者

感谢分享
回复

使用道具 举报

12#
发表于 2025-4-6 00:04:30 | 只看该作者
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2026-1-9 12:52

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表