是否可以使用sql语句搜索blob文本? 我可以从$ table中选择*,其中f1如'%foo%',如果f1是varchar,那么f1是一个blob怎么样?对此有何反对意见?
答案 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 function,LENGTH 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