SQLステートメントを使用してBLOBテキストを検索することはできますか? $ tableからselect *を実行できます。f1がvarcharの場合、f1は '%foo%'のようになりますが、f1はblobについてはどうですか?これに対応するものはありますか?
これは非常に可能で、簡単に実行できます。
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
;
それがWordまたはPDFドキュメントの場合、 Oracle Text を調べてください。
プレーンテキストを格納する場合は、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
以下のコードは、 TL_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%';