конвертировать blob (изображение) в varchar в оракуле - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь прочитать blob (изображение) из базы данных оракула и отобразить его в формате html.Изображение больше размера буфера, поэтому мне нужно сначала разделить его, а затем добавить все подстроки.Мой подход такой, как показано ниже (будет цикл, чтобы пройти через BLOB-объект):

SELECT utl_raw.cast_to_varchar2(dbms_lob.substr(FILE_CONTENTS,2000,1)) as mystring from doc where file_name='test.png'

Проблема в том, что преобразованная строка выглядит зашифрованной enter image description here

Я не указал char_set для конвертации, это может быть причиной?Если так, как я могу узнать, какой из них использовать?

Спасибо.

1 Ответ

0 голосов
/ 04 марта 2019

Вот функция для преобразования BLOB в Base64 строку:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...