我正在尝试从Oracle中的LONG列读取数据,该列存储了一个Image文件。这样做我得到以下: IL 39 32130580�3�10059�� \ 0 \ u0010JFIF \ 0 \ U0001 \ U0001 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0℃\ 0 \ B \ u0006 \ u0006 \
我认为问号不允许我解码字符串。 这些What是什么意思?
谢谢,
答案 0 :(得分:1)
通常,您根本不应使用LONG
数据类型。多年来deprecated。
除此之外,数据类型LONG
用于文字数据,例如VARCAHR2
或CLOB
。您不能将它用于图像等二进制数据。
根据评论进行更新
尝试此功能将LONG转换为BLOB - 祝您好运!
CREATE OR REPLACE FUNCTION ConvertLONG(InChar IN LONG) RETURN BLOB IS
dest_lob BLOB;
lang_context INTEGER := DBMS_LOB.DEFAULT_LANG_CTX;
dest_offset INTEGER := 1;
src_offset INTEGER := 1;
read_offset INTEGER := 1;
warning INTEGER;
BEGIN
DBMS_LOB.CREATETEMPORARY(dest_lob, TRUE);
DBMS_LOB.CONVERTTOBLOB(dest_lob, TO_LOB(InChar), DBMS_LOB.LOBMAXSIZE, dest_offset, src_offset, DBMS_LOB.DEFAULT_CSID, lang_context, warning);
RETURN dest_lob;
END;
答案 1 :(得分:0)
首先,您应该避免使用LONG数据类型列并切换到BLOB(或CLOB,具体取决于您计划存储在那里的内容)。在您的情况下,由于该列包含图像,这将是一个BLOB。
您不能期望SQL SELECT语句返回图像"按原样#34; (即实际上在屏幕上看到那个图像) - 你得到的就是那堆垃圾字符。毕竟,这是一个二进制文件。
当您使用TOAD时,转到模式浏览器,打开该表,查看其数据,右键单击存储图像的列,然后选择"导出Blob(Longs,Raws ...)"从菜单中。按照说明将图像导出到磁盘上的某个文件夹中。
否则,您必须创建一个能够显示/下载图像的应用程序(例如,使用Apex)。
如果那不是你想要做的(正如你提到的那样,你想要"解码"一个字符串),你能解释一下吗?