給Oracle新增split和splitstr函式

2022-02-12 06:41:20 字數 3491 閱讀 3257

最近專案中有很多需要做批量操作的需求,客戶端把一組逗號分隔的id字串傳給資料庫,儲存過程就需要把它們分割,然後逐個處理。

以往的處理方式有如下幾種:

1、在儲存過程內寫迴圈,逐個分析字串中的id,然後逐個處理。缺點:迴圈一次處理乙個,如果每次判斷都很多,效率將很受影響。適合每次處理要做單獨判斷的情況。

2、使用臨時表,先呼叫乙個儲存過程將id拆分並插入到臨時表中,然後結合臨時表可以寫sql一次處理多筆。缺點:需要插臨時表,效率不高,資料量越大影響越嚴重。

以前的專案用的最多的還是第2中方式,畢竟方便,且效率比第1種好。 

現在專案中用到了很多很多的批量操作,很多的重複**讓我不厭其煩。忽然想到,.net和js中都有split類似的函式,拆分字串很方便,oracle中要是也有這樣的功能該多好呀。

多方查詢資料發現,給oracle新增split函式是完全可以實現的,避免了插入臨時表,所以效率比上面的第2中方法效率高很多。

後來我還新增了splitstr函式,可以很方便獲取字串中的指定節點。 

有了這兩個函式,處理批量操作,真是如虎添翼,效率倍增,嘿嘿……

好了,閒話少說,上**!如有不妥之處,請各位前輩博友斧正。1/*

2* oracle 建立 split 和 splitstr 函式3*/

45/*建立乙個表型別 */6

create

orreplace type tabletype as

table

ofvarchar2(32676)7/

89/*建立 split 函式 

*/10

create

orreplace

function split (p_list clob, p_sep varchar2 :=',

')11

return tabletype

12    pipelined

13/*

*************************************

14* name:        split

15* author:      sean zhang.

16* date:        2012-09-03.

17* function:    返回字串被指定字元分割後的表型別。

18* parameters:  p_list: 待分割的字串。

19p_sep: 分隔符,預設逗號,也可以指定字元或字串。

20* example:     select *

21from users

22where u_id in (select column_value

23from table (split ('1,2')))

24返回u_id為1和2的兩行資料。

25*************************************

*/26

is27    l_idx    pls_integer;

28    v_list   varchar2 (32676) := p_list;

29begin

30    loop

31       l_idx   := instr (v_list, p_sep);

3233

if l_idx >034

then

35pipe row (substr (v_list, 1, l_idx -

1));

36          v_list   := substr (v_list, l_idx + length (p_sep));

37else

38pipe row (v_list);

39exit;

40end

if;41

end loop;

42end;43/

4445

/*建立 splitstr 函式 

*/46

create

orreplace

function splitstr (str

in clob,

47                                        i   in

number :=

0,48                                        sep in

varchar2 :=',

'49 )

50return

varchar2

51/*

*************************************

52* name:        splitstr

53* author:      sean zhang.

54* date:        2012-09-03.

55* function:    返回字串被指定字元分割後的指定節點字串。

56* parameters:  str: 待分割的字串。

57i: 返回第幾個節點。當i為0返回str中的所有字元,當i 超過可被分割的個數時返回空。

58sep: 分隔符,預設逗號,也可以指定字元或字串。當指定的分隔符不存在於str中時返回sep中的字元。

59* example:     select splitstr('abc,def', 1) as str from dual;  得到 abc

60select splitstr('abc,def', 3) as str from dual;  得到 空

61*************************************

*/62

is63    t_i       number;

64    t_count   number;

65    t_str     varchar2 (4000);

66begin

67if i =068

then

69       t_str   :=

str;

70    elsif instr (str, sep) =071

then

72       t_str   := sep;

73else

74select

count ( * )

75into t_count

76from

table (split (str, sep));

7778

if i <= t_count

79then

80select

str81

into t_str

82from (select rownum as item, column_value as

str83

from

table (split (str, sep)))

84where item = i;

85end

if;86

endif;

8788

return t_str;

89end;90/

Oracle給表和字段新增注釋

oracle給表和字段新增注釋。建立 學生資訊 資料表。建立 學生資訊 資料表 create table student info stu id int,學號 stu name varchar2 8 姓名 email varchar2 20 郵箱 char 2 性別 age int,年齡 class...

oracle給已有表新增主鍵

1,建立序列名 create sequence customer id seq increment by 1 每次加幾個 start with 1 從1開始計數 nomaxvalue 不設定最大值 nocycle 一直累加,不迴圈 cache 10 快取一旦定義了customer id seq序列,...

oracle實現split函式

oracle資料庫中某乙個字段可能存在以某些特殊符號隔開的字段,我們在查詢使用的時候往往需要將這些欄位spilt開 但是oracle沒有這個函式,網上搜尋了一下,找了乙個可以使用的函式 下面直接上指令碼 1.先建立乙個type create or replace type obj target as...