首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在oracle中将blob(image)转换为varchar

问在oracle中将blob(image)转换为varchar
EN

Stack Overflow用户
提问于 2019-03-01 11:34:03
回答 1查看 2K关注 0票数 0

我正在尝试从oracle db读取blob (图像)并将其显示在html中。图像大于缓冲区大小,所以我必须首先拆分它,然后附加所有子字符串。我的方法如下(将有一个循环遍历blob):

代码语言:javascript
复制
SELECT utl_raw.cast_to_varchar2(dbms_lob.substr(FILE_CONTENTS,2000,1)) as mystring from doc where file_name='test.png'

问题是转换后的字符串看起来像是乱码

​

我没有指定转换的char_set,会不会是这个原因?如果是这样的话,我怎么知道该使用哪一个?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-04 14:58:34

下面是一个将BLOB转换为Base64字符串的函数:

代码语言:javascript
复制
FUNCTION EncodeBASE64(InBlob IN BLOB) RETURN CLOB IS

    BlobLen INTEGER := DBMS_LOB.GETLENGTH(InBlob);
    read_offset INTEGER := 1;

    amount INTEGER := 1440; -- must be a whole multiple of 3
    -- size of a whole multiple of 48 is beneficial to get NEW_LINE after each 64 characters 
    buffer RAW(1440);
    res CLOB := EMPTY_CLOB();

BEGIN

    IF InBlob IS NULL OR NVL(BlobLen, 0) = 0 THEN 
        RETURN NULL;
    ELSIF BlobLen <= 24000 THEN
        RETURN UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(InBlob));
    ELSE
        -- UTL_ENCODE.BASE64_ENCODE is limited to 32k, process in chunks if bigger
        LOOP
            EXIT WHEN read_offset >= BlobLen;
            DBMS_LOB.READ(InBlob, amount, read_offset, buffer);
            res := res || UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(buffer));       
            read_offset := read_offset + amount;
        END LOOP;
    END IF;
    RETURN res;

END EncodeBASE64;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54937548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档