1. 程式人生 > 實用技巧 >oracle 自定義函式建立

oracle 自定義函式建立

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 connect
by 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;