2010-05-10 66 views
2

我希望只提取存儲blob的前1024個字節,而不是整個文件。原因是我想只是儘可能快地從文件中提取元數據,而不必選擇整個blob。從oracle讀取blob的第一個1kb

我瞭解以下內容:

select dbms_lob.substr(file_blob, 16,1) 
from file_upload 
where file_upload_id=504; 

它返回它的十六進制。我怎樣才能做到這一點,所以它返回二進制數據而不選擇整個blob?

在此先感謝。

回答

4

對於BLOB,DBMS_LOB.SUBSTR將返回RAW。大多數環境將以十六進制呈現。 您可以使用DUMP功能以其他格式查看它。

select dump(dbms_lob.substr(product_image,10,1),10), 
     dump(dbms_lob.substr(product_image,10,1),16), 
     dump(dbms_lob.substr(product_image,10,1),17) 
from APEX_DEMO.DEMO_PRODUCT_INFO 
where product_id = 9; 

這將返回十進制(例如0-255),十六進制和字符的BLOB的前10個字節。後者可能會在屏幕上拋出一些不可打印的垃圾,如果客戶端和數據庫字符集不匹配,則會進行一些「翻譯」。

你可以使用UTL_RAW.CAST_TO_VARCHAR2這可能會給你你想要的。

select utl_raw.cast_to_varchar2(dbms_lob.substr(product_image,10,1)) chr 
from APEX_DEMO.DEMO_PRODUCT_INFO 
where product_id = 9