代码之家  ›  专栏  ›  技术社区  ›  Skay

Oracle Blob文本搜索

  •  13
  • Skay  · 技术社区  · 14 年前

    是否可以使用SQL语句搜索blob文本? 我可以从$table中选择*如果f1是varchar,那么f1是blob呢?有这个的柜台吗?

    3 回复  |  直到 9 年前
        1
  •  4
  •   Tony Andrews    9 年前

    如果您存储的是纯文本,那么它应该是CLOB,而不是BLOB,然后您仍然可以使用LIKE进行查询。blob包含Oracle不知道其结构的二进制数据,因此它无法以这种方式搜索它。

    这适用于 任何 长度(至少在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
    

    注意,在6554401字节的CLOB中只有一个“z”——就在它的中间:

    SQL> select instr(c, 'z') from t1;
    
    INSTR(C,'Z')
    ------------
         3276701
    
        2
  •  53
  •   Olafur Tryggvason    9 年前

    这是完全可能的,而且很容易做到。

    只需将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
  •  4
  •   Gary Myers    14 年前

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