oracle 自定義函式建立
阿新 • • 發佈:2020-09-14
create or replace function GetWtlxname(guidname in varchar2) --定義引數 return varchar2 as pwtlxname varchar2(2000); begin --將行轉換成列 select wm_concat(wtlxname) wtlxname into pwtlxname from ( select guid,incident,wtlx,case wtlx when '1' then '審批時間過長' when '2' then '供應商接收時間過長' when '3' then '發貨時間過長' when '4' then '收貨時間過長' when '5' then '超時評價' when '6' then '服務問題' when '7' then '質量問題' when '8' then '送貨速度問題' when '10' then '物流時間過長' else '其它' end wtlxname from ( select guid,incident, --regexp_substr(str,reg,起始位置 第幾次) regexp_substr(wtlx, '[^,]+', 1, level) wtlx from sgs_zhgl_ddscyybzpt connectby level <= regexp_count(wtlx, ',') + 1 --regexp_count(teachers, ',') 統計字串中,的數量 and guid = prior guid --你能理解CONNECT BY吧?它相當於是一個遞迴的自連線,不斷地把每層的連線結果疊加到結果集中。兩層之間的連線條件和遞迴出口寫在CONNECT BY中。在這裡我們的資料並無父子關係,只是要讓同一行資料重複出現,因此我們的連線的條件只用到了表的主鍵id=PRIOR id, 此外再用LEVEL控制層數作為遞迴出口。但ORACLE有個檢查,如果你有前後連線條件(id=PRIOR id),但是同一行資料再次出現,它就會報一個錯:--ERROR: --ORA-01436: CONNECT BY loop in user data --為了欺騙它,這裡用了一個PRIOR DBMS_RANDOM.VALUE, 因為DBMS_RANDOM.VALUE每次呼叫都返回不同結果,所以它認為兩行資料不一樣,所以不報錯了。 and prior dbms_random.value is not null ) ss--3,4,5 )ss where guid = guidname group by guid; --直接返回 return pwtlxname; end GetWtlxname;