2010-06-03 77 views
10

是否可以使用sql語句搜索blob文本? 我可以從$表中選擇*,其中f1類似於'%foo%',如果f1是varchar,那麼f1如何是blob?任何計數器部分?oracle blob文本搜索

回答

3

如果你正在存儲純文本,它應該是一個CLOB,而不是一個BLOB,然後你仍然可以使用LIKE進行查詢。 BLOB包含Oracle不知道其結構的二進制數據,因此無法以此方式進行搜索。

此工程的CLOB的任何長度(至少在甲骨文12C):

SQL> create table t1 (c clob); 

Table created. 

SQL> declare 
    2  x clob; 
    3 begin 
    4  for i in 1..100 loop 
    5  x := x || rpad('x', 32767, 'x'); 
    6  end loop; 
    7  x := x || 'z'; 
    8  for i in 1..100 loop 
    9  x := x || rpad('x', 32767, 'x'); 
10  end loop; 
11  insert into t1 values (x); 
12 end; 
13/

PL/SQL procedure successfully completed. 

SQL> select dbms_Lob.getlength(c) from t1 where c like '%z%'; 

DBMS_LOB.GETLENGTH(C) 
--------------------- 
       6553401 

需要注意的是,只有一個在6554401字節CLOB「Z」 - 就在它的中間:

SQL> select instr(c, 'z') from t1; 

INSTR(C,'Z') 
------------ 
    3276701 
+2

@Olafur下方有個好有用的答案: http://stackoverflow.com/a/16301995/510711 – flob 2015-03-02 15:34:34

+0

這也是錯誤的。它只適用於<32767個字符的CLOBS。這是相當小的。 instr之類的會在這之後中斷,你必須使用dbms_lob.instr來進行搜索。 – 2015-03-11 11:29:12

+0

@Olafur:你的批評是錯誤的,因爲我已經更新了我的回答。 – 2015-03-11 12:54:24

39

這是非常可能和容易做到的。

結合使用時只需用dbms_lob.instr utl_raw.cast_to_raw

所以你的情況,如果T1是BLOB選擇會是什麼樣子:

select * 
    from table1 
where dbms_lob.instr (t1, -- the blob 
        utl_raw.cast_to_raw ('foo'), -- the search string cast to raw 
        1, -- where to start. i.e. offset 
        1 -- Which occurrance i.e. 1=first 
        ) > 0 -- location of occurrence. Here I don't care. Just find any 
; 
+2

++當數據庫不是你的時候,說模式是錯誤的並不是全部有用。非常感謝你爲復活和回答這個問題! – Decker 2014-03-28 20:42:00

+0

這很慢,但它的工作原理,謝謝! – 2014-07-30 08:20:45

+0

這真的幫助我謝謝! – 2017-03-08 17:42:17