ora-22922:不存在的clob值


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

相關文章
相關標籤/搜索