今天測試存儲過程遇到一個錯誤: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關鍵字放置的位置不一樣,決定查詢時的檢索順序。放置於等號前表示從根節點到葉子節點檢索,即自頂向下的方式;若是放置在等號的後面表示從葉子節點到根節點的順序檢索,即自底向上。