2010-06-03 30 views
10

E 'possibile cercare attraverso il testo blob usando l'istruzione sql? Posso selezionare * dalla tabella $ dove f1 mi piace '% foo%' se f1 è varchar, che ne dici di f1 è un blob? Qualche controparte per questo?ricerca testo blob oracle

risposta

3

Se si memorizza testo normale, dovrebbe essere un CLOB, non un BLOB, e quindi è possibile eseguire query utilizzando LIKE. Un BLOB contiene dati binari che Oracle non conosce la struttura di, quindi non può cercarlo in questo modo.

Questo funziona per CLOB di qualsiasi lunghezza (almeno su Oracle 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 

Si noti che c'è un solo 'z' in quel CLOB 6.554.401 byte - proprio nel bel mezzo di esso:

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

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

@Olafur ha una buona risposta utile qui di seguito: http://stackoverflow.com/a/16301995/510711 – flob

+0

Anche questo è sbagliato. Funziona solo con CLOBS che sono <32767 caratteri. Che è piuttosto piccolo instr e like si interromperanno dopo che devi usare dbms_lob.instr per cercare. –

+0

@Olafur: la tua critica è falsa in quanto ho aggiornato la mia risposta per mostrare. –

3

Se si tratta di un documento Word o PDF, guardare in Oracle Text.

39

Questo è abbastanza possibile e facile da fare.

Basta usare dbms_lob.instr in combinazione con utl_raw.cast_to_raw

Quindi nel tuo caso, se T1 è un BLOB di selezione sarà simile:

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

++ Quando il database non è il tuo, dire che lo schema è sbagliato non è utile tutto. Grazie mille per resuscitare e rispondere alla domanda! – Decker

+0

È lento, ma funziona, grazie! –

+0

questo mi ha davvero aiutato grazie! –