oracle blob文本搜索

时间:2010-06-03 06:44:37

标签: oracle search blob

是否可以使用sql语句搜索blob文本? 我可以从$ table中选择*,其中f1如'%foo%',如果f1是varchar,那么f1是一个blob怎么样?对此有何反对意见?

5 个答案:

答案 0 :(得分:56)

这很容易做到。

只需将dbms_lob.instr与utl_raw.cast_to_raw结合使用

因此,在您的情况下,如果t1是BLOB,则select将如下所示:

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
;

答案 1 :(得分:4)

如果要存储纯文本,它应该是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,554,401字节CLOB中只有一个'z' - 正好位于其中间:

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

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

答案 2 :(得分:4)

如果是Word或PDF文档,请查看Oracle Text

答案 3 :(得分:0)

下面的代码是使用UTL_RAW.CAST_TO_VARCHAR2 function将blob的详细信息显示为文本,然后使用substr function将文本从预期数据的开头一直剪切到结尾。但是,如果知道要查找的数据的位置,则可以使用instr functionLENGTH function

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%';

答案 4 :(得分:-1)

选择*来自TABLE_NAME 和dbms_lob.instr(“ BLOB_VARIABLE_NAME”,utl_raw.cast_to_raw('search_text'),1,1)> 0