我在informix数据库中有一些图像,作为二进制blob字段(jpg),我如何用SQL将图像写入磁盘?
数据是存储在BYTE还是BLOB字段中?
如果数据存储在BLOB列中,则可以使用:
SELECT LOTOFILE(blob_column, '/path/to/file/on/client', 'client')
FROM TheTable
WHERE PK_Column = 23411 -- PK value
Run Code Online (Sandbox Code Playgroud)
如果数据存储在BYTE列中,那么您必须更加努力地工作.如果您的计算机上有ESQL/C(ClientSDK)和C编译器,那么我建议从IIUG软件存档中获取SQLCMD 并解压缩软件.您需要Informix环境集,并且需要能够编译C程序.然后运行:
./configure --prefix=$HOME/bin
Run Code Online (Sandbox Code Playgroud)
您指定的前缀并不重要 - 您只需运行configure脚本即可.
然后你可以编译everything(make),也可以简单地编译程序selblob(make selblob).那个节目就是我所谓的'小插曲'; 一个微观程序,显示如何选择BYTE blob到磁盘.然而,它也是全功能的; 它几乎可以与您抛出的任何东西一起使用,或者诊断错误.
如果调用precious了数据库,则字节数据位于表中byte_table,包含数据的列是byte_column,并且主键列是col1(并且所需的值是23)和col2(以及所需的值是"Habeas Corpus"),然后您可以运行:
selblob -d precious -t byte_table -k col1=23 -k col2="Habeas Corpus" \
-c byte_column -f output_file
Run Code Online (Sandbox Code Playgroud)
这会将字节值卸载到指定的文件中.
如果您没有ESQL/C或C编译器或使用它们的权限,那么生活就更难了.最接近的方法是在DB-Access中使用UNLOAD语句:
dbaccess precious - <<!
unload to "output_file"
select byte_column from byte_table where col1 = 23 and col2 = 'Habeas Corpus';
!
Run Code Online (Sandbox Code Playgroud)
这将创建一个包含字节值的十六进制转储的文件(每个字符2个字节).然后,您需要对文件进行后处理,以将十六进制转换为常规数据.请注意,如果列是TEXT列而不是BYTE列,则不需要转换.您可以使用一个相当简单的Perl脚本来进行转换(假设文件足够小以便插入内存 - 如果它不够小,您必须更努力地工作):
perl -w -e '
$/ = "";
my $data = <>;
while (length($data) > 1)
{
my $hex = substr($data, 0, 2);
printf "%c", hex($hex);
$data = substr($data, 2);
}' <output_file
Run Code Online (Sandbox Code Playgroud)
长度条件指定' > 1'处理卸载数据末尾的换行符.
(对于'歇斯底里的葡萄干',又名'历史原因',我仍然称之为BYTE和TEXT'blob类型',尽管IDS 9.00为'smart blobs'引入了显式名称BLOB和CLOB,这是一对略有不同的数据类型大致相应的功能 - 在我的书中,它们都是blob(小写)类型.这是在1990年,在BLOB和CLOB blob被添加之前六年或更长时间了解BYTE和TEXT blob的老家伙的麻烦.对于旧式blob,没有一个很好的替代官方术语;使用'dumb blobs'在政治上是不正确的!)
| 归档时间: |
|
| 查看次数: |
4565 次 |
| 最近记录: |