从 oracle 读取 blob 的前 1kb

Ang*_*gus 2 oracle select blob

我希望只提取存储的 blob 的前 1024 个字节,而不是整个文件。这样做的原因是我只想尽快从文件中提取元数据,而不必选择整个 blob。

我明白以下几点:

select dbms_lob.substr(file_blob, 16,1) 
from file_upload 
where file_upload_id=504;
Run Code Online (Sandbox Code Playgroud)

它以十六进制形式返回。我该怎么做才能在不选择整个 blob 的情况下以二进制数据形式返回它?

提前致谢。

Gar*_*ers 5

对于 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;
Run Code Online (Sandbox Code Playgroud)

这将以十进制(例如 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
Run Code Online (Sandbox Code Playgroud)