Oracle拆分字串函式

2021-06-26 15:51:19 字數 1970 閱讀 9609

原文中

有個錯誤

v_start := v_length + 

1;

雖然設定下次查詢起點為字串長度+1,但下次v_index還是0,程式不會退回。程式沒有退出條件,故本句應改出使程式退出。

exit;
還有,原文中未檢測傳入的字串引數為null或為空的情況(此時返回的v_index為空),下面改正了,見紅色字型部分。

本函式可以將「目標字串」以「指定字串」進行拆分,並通過表結構返回結果。**如下:

create or replace type 

str_split

is table of varchar2

(4000

);create or replace function

splitstr(p_string

in varchar2

, p_delimiter

in varchar2

)

return

str_split

pipelined

as

v_length

number

:= length(p_string);

v_start

number

:= 1

; v_index

number

;begin

while

(v_start <= v_length)

loop

v_index := instr(p_string, p_delimiter, v_start);

if v_index =

0

then

pipe row

(substr(p_string, v_start));

exit;

--v_start := v_length +

1;--這不能使程式退出,應改為exit;

elsif v_index>0 then --

else

pipe row

(substr(p_string, v_start, v_index - v_start));

v_start := v_index + 1;

else

exit;--傳入的是空字串或null,則返回值也沒null

end if

;

end loop

;

return

;end

splitstr;

建立完畢後,我們來測試一下,例如執行如下sql:

select 

* from table

(splitstr(

'hello,cnblogs!'

,','

));

其輸出結果為乙個兩行的表,如下圖:

將行轉為列顯示:

select 

a.column_value v1,b.column_value v2

from

(select

* from

(select rownum

rn,t.*

from table

(splitstr(

'hello,cnblogs!'

,','

)) t)) a,

(select

* from

(select rownum

rn,t.*

from table

(splitstr(

'hello,cnblogs!'

,','

)) t)) b

where

a.rn=

1 and

b.rn=

2

如圖:

原文:另一篇:

Oracle拆分字串函式

本函式可以將 目標字串 以 指定字串 進行拆分,並通過表結構返回結果。如下 create or replace type str split is table of varchar2 4000 create or replace function splitstr p string in varch...

Oracle 拆分字串

create or replace function splitstr p string in varchar2,p delimiter in varchar2 return str split pipelined as v length number length p string v start...

oracle拆分字串

create or replace type array string is table of varchar2 2000 create or replace function f split string 拆分字串 author zhaohuihua i src in varchar2,待拆分的字...