2010-06-03 43 views
10

Có thể tìm kiếm qua văn bản blob bằng câu lệnh sql không? Tôi có thể chọn * từ bảng $ nơi f1 như '% foo%' nếu f1 là varchar, khoảng f1 là blob? Bất kỳ phần truy cập cho điều này?Tìm kiếm văn bản oracle blob

Trả lời

3

Nếu bạn đang lưu trữ văn bản thuần túy, nó phải là một CLOB, không phải là BLOB, và sau đó bạn vẫn có thể truy vấn bằng cách sử dụng LIKE. Một BLOB chứa dữ liệu nhị phân mà Oracle không biết cấu trúc của, vì vậy nó không thể tìm kiếm theo cách này.

này làm việc cho CLOBs của bất kỳ chiều dài (ít nhất là trên 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 

Lưu ý rằng chỉ có một 'z' trong đó 6.554.401 byte CLOB - ngay ở giữa của nó:

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

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

@Olafur có một câu trả lời hữu ích tốt dưới đây: http://stackoverflow.com/a/16301995/510711 – flob

+0

Điều này cũng sai. Nó chỉ hoạt động cho CLOBS có <32767 ký tự. Đó là khá nhỏ. instr và như thế sẽ phá vỡ sau đó bạn phải sử dụng dbms_lob.instr để tìm kiếm. –

+0

@Olafur: sự chỉ trích của bạn là sai vì tôi đã cập nhật câu trả lời của mình để hiển thị. –

3

Nếu nó là một tài liệu Word hoặc PDF, nhìn vào Oracle Text.

39

Điều này khá khả thi và dễ thực hiện.

Đơn giản chỉ cần sử dụng dbms_lob.instr kết hợp với utl_raw.cast_to_raw

Vì vậy, trong trường hợp của bạn, nếu t1 là một BLOB sự chọn sẽ trông như thế:

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 
; 
+2

++ Khi cơ sở dữ liệu không phải là của bạn, để nói lược đồ là sai là không hữu ích tất cả. Cảm ơn bạn rất nhiều vì đã hồi sinh và trả lời câu hỏi! – Decker

+0

Rất chậm, nhưng nó hoạt động, Cảm ơn! –

+0

điều này thực sự đã giúp tôi cảm ơn! –

Các vấn đề liên quan