今天测试存储过程遇到一个错误:ora-22922:不存在的clob值。
经排查后,得出是使用wm_concat行转列函数造成的。
这个函数在之前的版本是返回varchar类型的,在10.2.0.5和11.2.0.3版本中返回成clob类型。
使用to_char函数将clob类型转换成char类型,直接执行是可以的,但是在存储过程中还是会报上面的错误。
select t.innercode,
to_char(replace(wm_concat(t.managername || '(' || t.experienceyear || ')'),
',',
';')) tzjl
from tp_fundmanager t
group by t.innercode;
直接度娘一下,有好多人也遇到相同问题,解决方法不一,有的直接转换成string类型或者long类型,有的重新wm_concat函数,等,这些方法要不不能解决我的问题,要不就是太复杂,最后问我们项目经理,他给出了一个比较简单的方法,修改如下:
select t.innercode,
ltrim(max(sys_connect_by_path(t.managername || '(' || t.experienceyear || ')',',')), ',') tzjl
from (select innercode,managername,experienceyer,row_number() over(partition by innercode order by 1) rn tp_fundmanager) t
start with rn=1
connect by rn-1=prior rn
and innercode=prior innercode
group by t.innercode;
问题解决,不过这个有个限制就是:返回的字段长度不能太长,会报错。
sys_connect_by_path(字段名,连接字段之间的字符)这个函数在使用之前,需要先建立一个树。
start with 条件1 connect by 条件 :就是来建立树结构的。
条件1:表示树的开始节点,即树的根节点。
条件2:表示的是下一行和上一行的关联关系。
本例中 rn=1 表示从排序结果的第一行开始,rn-1=prior rn 表示下一行的序号-1等于上一行的序号,innercode=prior innercode表示下一行的innercode等于上一行的innercode。
prior关键字放置的位置不同,决定查询时的检索顺序。放置于等号前表示从根节点到叶子节点检索,即自顶向下的方式;如果放置在等号的后面表示从叶子节点到根节点的顺序检索,即自底向上。
转载于:https://blog.51cto.com/2898036/1689870