Подтвердить что ты не робот

Текстовый поиск оракула blob

Можно ли выполнить поиск по тексту blob с помощью оператора sql? Я могу сделать select * from $table, где f1, например, "% foo%", если f1 является varchar, а как f1 является блобом? Любая счетная часть для этого?

4b9b3361

Ответ 1

Если вы сохраняете обычный текст, он должен быть CLOB, а не BLOB, а затем вы можете запросить LIKE. BLOB содержит двоичные данные, которые Oracle не знает о структуре, поэтому он не может искать ее таким образом.

Это работает для CLOB любой длины (по крайней мере, на 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

Обратите внимание, что в этом 6 544 401 байт CLOB есть только один "z" - прямо посередине:

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

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

Ответ 2

Это вполне возможно и легко сделать.

Просто используйте 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
;

Ответ 3

Если это документ Word или PDF, просмотрите Текст Oracle.

Ответ 4

приведенный ниже код должен отображать детали из BLOB- объекта в виде текста с использованием функции UTL_RAW.CAST_TO_VARCHAR2, затем мы используем функцию substr, чтобы вырезать текст от начала ожидаемых данных до конца. тем не менее, вы можете использовать функцию instr, функцию LENGTH, если вы знаете расположение данных, которые вы ищете

select NVL(SUBSTR(UTL_RAW.CAST_TO_VARCHAR2(blob_body), 
INSTR(UTL_RAW.CAST_TO_VARCHAR2(blob_body), '<ns:xml_element>') + LENGTH('<ns:xml_element>'),
INSTR(UTL_RAW.CAST_TO_VARCHAR2(blob_body), '</ns:xml_element>') - (
INSTR(UTL_RAW.CAST_TO_VARCHAR2(blob_body), '<ns:xml_element>') + LENGTH('<ns:xml_element>'))),
    utl_raw.cast_to_varchar2(DBMS_LOB.SUBSTR(blob_body))
    ) blob_body
from dual 
where SUBSTR(UTL_RAW.CAST_TO_VARCHAR2(blob_body), 
INSTR(UTL_RAW.CAST_TO_VARCHAR2(blob_body), '<ns:xml_element>') + LENGTH('<ns:xml_element>'),
INSTR(UTL_RAW.CAST_TO_VARCHAR2(blob_body), '</ns:xml_element>') - (
INSTR(UTL_RAW.CAST_TO_VARCHAR2(blob_body), '<ns:xml_element>') + LENGTH('<ns:xml_element>'))) like '%foo%';