2010-06-03 36 views
10

¿Es posible buscar a través de blob text utilizando sql statement? Puedo seleccionar * de $ table donde f1 como '% foo%' si f1 es varchar, ¿qué tal si f1 es un blob? Cualquier contraparte para esto?oracle blob text search

Respuesta

3

Si está almacenando texto sin formato, debe ser un CLOB, no un BLOB, y aún puede consultar utilizando LIKE. Un BLOB contiene datos binarios de los que Oracle no conoce la estructura, por lo que no puede buscarlos de esta manera.

Esto funciona para CLOBs de cualquier longitud (al menos en 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 

Tenga en cuenta que sólo hay una 'z' en el que CLOB 6554401 bytes - justo en el centro de la misma:

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

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

@Olafur tiene una buena respuesta es útil a continuación: http://stackoverflow.com/a/16301995/510711 – flob

+0

Esto también es incorrecto. Solo funciona para CLOBS que son <32767 caracteres. Que es bastante pequeño instr y like se romperán después de eso, tienes que usar dbms_lob.instr para buscar. –

+0

@Olafur: su crítica es falsa ya que he actualizado mi respuesta para mostrarla. –

3

Si se trata de un documento de Word o PDF, mira en Oracle Text.

39

Esto es muy posible y fácil de hacer.

Utilice simplemente dbms_lob.instr conjuntamente con utl_raw.cast_to_raw

Así, en su caso, si T1 es un BLOB el selectivo se vería así:

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

++ Cuando la base de datos no es suya, decir que el esquema es incorrecto no es de ayuda. ¡Muchas gracias por resucitar y responder la pregunta! – Decker

+0

Es lento, pero funciona, ¡Gracias! –

+0

esto realmente me ayudó gracias! –