oracle 自定義列轉行函式

2021-07-16 16:44:54 字數 2087 閱讀 6194

-- 定義乙個物件型別.

create or replace type ty_row_str_split as object (strvalue varchar2 (4000));

-- 定義乙個 表/陣列型別, 內容是前面定義的那個物件.

create or replace type ty_tbl_str_split is table of ty_row_str_split;

--------------------

-- 字元分割函式.

-- 引數1:  被分割的源字串

-- 引數2:  用於拆分的字串。

--------------------

create or replace function fn_split(

p_str       in varchar2,

p_delimiter in varchar2)

return ty_tbl_str_split is

j         int := 0;

i         int := 1;

-- 被分割的源字串 的長度.

len       int := 0;

-- 分隔字串的長度

len1      int := 0;

-- 暫存的中間每乙個單元的文字資訊.

str       varchar2(4000);

-- 預期返回結果.

str_split ty_tbl_str_split := ty_tbl_str_split();

begin

-- 被分割的源字串 的長度.

len   := length(p_str);

-- 分隔字串的長度.

len1 := length(p_delimiter);

-- 遍歷 被分割的源字串.

while j < len loop

-- 在被分割的源字串中, 查詢 分隔字串.

j := instr(p_str, p_delimiter, i);

if j = 0 then

-- j=0 意味著沒有找到. 

-- 可以理解為是查詢到最後乙個單元了.

-- 設定 j := len, 讓外部的迴圈處理可以結束了.

j  := len;

-- 獲取最後乙個單元的內容.

str := substr(p_str, i);

-- 結果追加一行.

str_split.extend;

-- 設定結果內容.

str_split(str_split.count) := ty_row_str_split(strvalue => str);

if i >= len then

exit;

end if;

else

-- 如果在被分割的源字串中,找到了 分隔字串.

-- 首先,獲取分割的內容.

str := substr(p_str, i, j - i);

-- 然後設定索引, 下一次再查詢的時候,從指定的索引位置開始(不是從0開始找了)

i := j + len1;

-- 結果追加一行.

str_split.extend;

-- 設定結果內容.   

轉換後結果

當然這個地方還需要做一些去重的操作這裡就不在贅述了簡單的去重就可以實現了

Oracle自定義函式

語法如下 create or replace function function name argment type,argment type return return type 返回資料的型別 變數的申明,比如 stryuan varchar2 150 begin function body 函...

oracle 自定義函式

下面是乙個前輩寫的判斷是否是手機號的函式 create or replace function ismobile pmsg varchar2 return number isvprefix varchar2 20 vlen number begin vlen lengthb pmsg if vlen...

Oracle自定義函式

二 刪除自定義函式 三 應用經驗 在oracle資料庫中,為了實現特定的功能,可以自定義函式,就像c c 語言,除了系統的庫函式,程式設計師還會編寫很多自定義的函式。create or replace function 函式名 引數1 模式 資料型別,return 資料型別 as 定義區域性變數。變...