今天测试存储过程遇到一个错误:ora-22922:不存在的clob值。
sql
经排查后,得出是使用wm_concat行转列函数形成的。ide
这个函数在以前的版本是返回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函数,等,这些方法要不不能解决个人问题,要不就是太复杂,最后问咱们项目经理,他给出了一个比较简单的方法,修改以下:spa
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;
问题解决,不过这个有个限制就是:返回的字段长度不能太长,会报错。code
sys_connect_by_path(字段名,链接字段之间的字符)这个函数在使用以前,须要先创建一个树。orm
start with 条件1 connect by 条件 :就是来创建树结构的。排序
条件1:表示树的开始节点,即树的根节点。
string
条件2:表示的是下一行和上一行的关联关系。
it
本例中 rn=1 表示从排序结果的第一行开始,rn-1=prior rn 表示下一行的序号-1等于上一行的序号,innercode=prior innercode表示下一行的innercode等于上一行的innercode。
prior关键字放置的位置不一样,决定查询时的检索顺序。放置于等号前表示从根节点到叶子节点检索,即自顶向下的方式;若是放置在等号的后面表示从叶子节点到根节点的顺序检索,即自底向上。