最近專案中有很多需要做批量操作的需求,客戶端把一組逗號分隔的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...