Можно ли выполнить поиск по тексту blob с помощью оператора sql? Я могу сделать select * from $table, где f1, например, "% foo%", если f1 является varchar, а как f1 является блобом? Любая счетная часть для этого?
Текстовый поиск оракула blob
Ответ 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%';