web-dev-qa-db-ja.com

オラクルブロブテキスト検索

SQLステートメントを使用してBLOBテキストを検索することはできますか? $ tableからselect *を実行できます。f1がvarcharの場合、f1は '%foo%'のようになりますが、f1はblobについてはどうですか?これに対応するものはありますか?

19
Skay

これは非常に可能で、簡単に実行できます。

Utl_raw.cast_to_rawと組み合わせてdbms_lob.instrを使用するだけです

したがって、あなたの場合、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
;
61

それがWordまたはPDFドキュメントの場合、 Oracle Text を調べてください。

4
Gary Myers

プレーンテキストを格納する場合は、BLOBではなくCLOBである必要があります。その後、LIKEを使用してクエリを実行できます。 BLOBには、Oracleが構造を知らないバイナリデータが含まれているため、この方法では検索できません。

これはany長さの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」が1つしかないことに注意してください-その真ん中:

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

INSTR(C,'Z')
------------
     3276701
4
Tony Andrews

以下のコードは、 TL_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%';
0
NoOoNY