ora-22922:不存在的clob值


今天测试存储过程遇到一个错误: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关键字放置的位置不同,决定查询时的检索顺序。放置于等号前表示从根节点到叶子节点检索,即自顶向下的方式;如果放置在等号的后面表示从叶子节点到根节点的顺序检索,即自底向上。




你可能感兴趣的:(ora-22922:不存在的clob值)