Oracle中CLOB和BLOB欄位雖說在開發中滿足了存放超大內容的要求,但是在一些簡單使用中確頻頻帶來麻煩。CLOB中存放的是指標,並不能直接取到實際值。而SQLServer中的text欄位就很方便,可以直接拿來與需要的字串比對,象什麼等於呀小於呀Like呀不在話下。可是換成Oracle就麻煩死了,要開闢一個緩衝,把內容一段段讀取出來後轉換,難道寫個where條件都這麼複雜?經過多方尋求資料,終於發現一個方便簡單的方法:利用dbms_lob 包中的方法(放心,內建的)instr和substr 。具體的介紹如下:
instr函數與substr函數
instr函數用於從指定的位置開始,從大型物件中尋找第N個與模式比對的字串。
用於尋找內部大對象中的字串的instr函數文法如下:
1: dbms_lob.instr(
2: lob_loc in clob character set any_cs,
3: pattern in varchar2 character set lob_loc%charset,
4: offset in integer:=1,
5: nth in integer := 1)
6: return integer;
7:
lob_loc為內部大對象的定位器
pattern是要匹配的模式
offset是要搜尋匹配檔案的開始位置
nth是要進行的第N次匹配
substr函數
substr函數用於從大對象中抽取指定數位的位元組。當我們只需要大對象的一部分時,通常使用這個函數。
操作內部大對象的substr函數文法如下:
其中各個參數的含義如下:
lob_loc是substr函數要操作的大型物件定位器
amount是要從大型物件中抽取的位元組數
offset是指從大型物件的什麼位置開始抽取資料。
如果從大型物件中抽取資料成功,則這個函數返回一個 raw 值。如果有一下情況,則返回null:
1 任何輸入參數尾null
2 amount < 1
3 amount > 32767
4 offset < 1
5 offset > LOBMAXSIZE
1: dbms_lob.instr(
2: lob_loc in blob,
3: pattern in raw,
4: offset in integer := 1;
5: nth in integer := 1)
6: return integer;
7: dbms_lob.substr(
8: lob_loc in blob,
9: amount in integer := 32767,
10: offset in integer := 1)
11: return raw;
12: dbms_lob.substr(
13: lob_loc in clob character set any_cs,
14: amount in integer := 32767,
15: offset in integer := 1)
16: return varchar2 character set lob_loc%charset;
照下面樣本,很容易看懂:
1: declare
2: source_lob clob;
3: pattern varchar2(6) := 'Oracle';
4: start_location integer := 1;
5: nth_occurrence integer := 1;
6: position integer;
7: buffer varchar2(100);
8: begin
9: select clob_locator into source_lob from mylobs where lob_index = 4;
10: position := dbms_lob.instr(source_lob, pattern, start_location, nth_occurrence);
11: dbms_output.put_line('The first occurrence starts at position:' || position);
12:
13: nth_occurrence := 2;
14: select clob_locator into source_lob from mylobs where lob_index = 4;
15: position := dbms_lob.instr(source_lob, pattern, start_location, nth_occurrence);
16: dbms_output.put_line('The first occurrence starts at position:' || position);
17:
18: select clob_locator into source_lob from mylobs where lob_index = 5;
19: buffer := dbms_lob.substr(source_lob, 9, start_location);
20: dbms_output.put_line('The substring extracted is: ' || buffer);
21: end;
輸出結果為:
The first occurrence starts at position:8
The first occurrence starts at position:24
The substring extracted is: Oracle 9i
哈哈,輕鬆搞定CLOB欄位的比對匹配篩選,不用一大堆的預存程序和函數,祝大家好運!