powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Blob - base64 (раскодировка)
12 сообщений из 12, страница 1 из 1
Blob - base64 (раскодировка)
    #39514907
KLAYD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! Просьба помочь, фотографии хранятся в таблице в поле с типом Blob в зашифрованном виде (base64), просьба помочь с раскодировкой, что бы на выходе получался тот же blob уже с изображением. Пробовал такой вариант:
create or replace function Decode_64(p_clob blob) return blob
IS
l_clob blob;
l_len number;
l_pos integer := 1;
l_buffer raw(2000);
l_amount integer := 2000;

begin

l_len := dbms_lob.getlength(p_clob);
dbms_lob.createtemporary(l_clob, true);

while l_pos <= l_len loop
dbms_lob.read (p_clob, l_amount, l_pos, l_buffer);
l_buffer := utl_encode.base64_decode(l_buffer);
l_pos := l_pos + l_amount;
dbms_lob.writeappend(l_clob, l_amount, l_buffer);
end loop;

return l_clob;
end Decode_64;

Но выдаёт ошибку в dbms_lob.writeappend (
...
Рейтинг: 0 / 0
Blob - base64 (раскодировка)
    #39515123
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вы посмотрите на размер своего буфера после decode.

Длина закодированных данных в base64 никак не равна длине исходных данных обычно.
...
Рейтинг: 0 / 0
Blob - base64 (раскодировка)
    #39515237
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anvanoДлина закодированных данных в base64 никак не равна длине исходных данных обычно.
Еще следует ознакомиться с самим представлением base64 - рвать base64-данные на куски произвольным образом не следует.
...
Рейтинг: 0 / 0
Blob - base64 (раскодировка)
    #39515559
KLAYD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хммм, попробовал ограничить по длинне

create or replace function Decode_64(p_clob blob) return blob
IS
l_clob blob;
l_len number;
l_pos integer := 1;
l_buffer raw(2000);
l_amount integer := 2000;

begin

l_len := dbms_lob.getlength(p_clob);
dbms_lob.createtemporary(l_clob, true);

while l_pos <= l_len loop
dbms_lob.read (p_clob, l_amount, l_pos, l_buffer);
l_buffer := utl_encode.base64_decode(l_buffer);
l_pos := l_pos + l_amount;

while l_buffer > 0 loop
dbms_lob.writeappend(l_clob, l_amount, substr(l_buffer,1,2000));
if length(l_buffer) > 2000 then
l_buffer := substr(l_buffer,2001);
end if;
end loop;
end loop;

return l_clob;
end Decode_64;
-------------------
выводит ту же ошибку в поле dbms_lob.writeappend(l_clob, l_amount, substr(l_buffer,1,2000));

ORA-21560: argument 2 is null, invalid, or out range
...
Рейтинг: 0 / 0
Blob - base64 (раскодировка)
    #39515567
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KLAYDвыводит ту же ошибку в поле dbms_lob.writeappend(l_clob, l_amount, substr(l_buffer,1,2000));

ORA-21560: argument 2 is null, invalid, or out range

Это не та же ошибка и она со всей очевидностью говорит вам, что не так.
Переменная l_amount пустая. Вы её никак не инициализировали.
...
Рейтинг: 0 / 0
Blob - base64 (раскодировка)
    #39515572
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anvanoKLAYDвыводит ту же ошибку в поле dbms_lob.writeappend(l_clob, l_amount, substr(l_buffer,1,2000));

ORA-21560: argument 2 is null, invalid, or out range

Это не та же ошибка и она со всей очевидностью говорит вам, что не так.
Переменная l_amount пустая. Вы её никак не инициализировали.

Хотя вижу, что инициализировали, но наткнулись на те же грабли.

l_buffer ДО преобразования и l_buffer после преобразования - совершенно разные вещи, имеющие разную длину.

и длина substr(l_buffer,1,2000) может получиться меньше 2000 , в итоге вы ошибку и ловите
...
Рейтинг: 0 / 0
Blob - base64 (раскодировка)
    #39515582
KLAYD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я проверял, во время первого прохода цикла l_buffer = где то 2760 символов, после чего я ограничиваю до 2000 символов, функция валится уже во время первого прохода цикла(
...
Рейтинг: 0 / 0
Blob - base64 (раскодировка)
    #39515860
KLAYD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
попробовал другой вариант функции
---------------------------------------------------
create or replace function Decode_64_2(p_clob blob) return blob
IS
v_blob blob;
v_rezult blob;
v_offset integer;
v_buffer_size integer := 48;
v_buffer_raw raw(48);

begin

dbms_lob.createtemporary(v_blob, true);

v_offset := 1;

for i in 1 .. ceil(dbms_lob.getlength(p_clob) / v_buffer_size) loop
dbms_lob.read(p_clob, v_buffer_size, v_offset, v_buffer_raw);
v_buffer_raw := utl_encode.base64_decode(v_buffer_raw);
dbms_lob.writeappend(v_blob, utl_raw.length(v_buffer_raw), v_buffer_raw);
v_offset := v_offset + v_buffer_size;
end loop;

v_rezult := v_blob;
dbms_lob.freetemporary(v_blob);

return v_rezult;
end Decode_64_2;
---------------------------------------------------
компилируется нормально, но при выполнении select decode_64(t.tm_photo)
from TB_TASK_MESSAGES t (когда я в общем то и передаю в поле значение с типом BLOB), выскакивает ошибка ORA-24813: cannot send or receive an unsupported LOB. Никак не пойму в чём затык, вроде во многих примерах как раз подобная функция и приводится...
...
Рейтинг: 0 / 0
Blob - base64 (раскодировка)
    #39517327
EDUARD_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KLAYD,

используй Java.
...
Рейтинг: 0 / 0
Blob - base64 (раскодировка)
    #39517337
где то стырил, не помню где уже

FUNCTION get_blob_from_base64_string(p_clob CLOB) RETURN BLOB IS
l_chunk BLOB; --Chunks of decoded blob that'll be appended
l_result BLOB; --Final blob result to be returned
l_rawout RAW(32767); --Decoded raw data from first pass decode
l_rawin RAW(32767); --Encoded raw data chunk
l_amt NUMBER DEFAULT 7700;
--Default length of data to decode
l_offset NUMBER DEFAULT 1;
--Default Offset of data to decode
l_tempvarchar VARCHAR2(32767);
BEGIN
DBMS_LOB.createtemporary(l_result, FALSE, DBMS_LOB.CALL);
DBMS_LOB.createtemporary(l_chunk, FALSE, DBMS_LOB.CALL);
LOOP
DBMS_LOB.READ(p_clob, l_amt, l_offset, l_tempvarchar);
l_offset := l_amt + l_offset;
l_rawin := UTL_RAW.cast_to_raw(l_tempvarchar);
l_rawout := UTL_ENCODE.base64_decode(l_rawin);
l_chunk := to_blob(l_rawout);
DBMS_LOB.append(l_result, l_chunk);
END LOOP;
return l_result;
EXCEPTION
WHEN NO_DATA_FOUND THEN
return NULL;
END;
...
Рейтинг: 0 / 0
Blob - base64 (раскодировка)
    #39518413
Фотография rf_mail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Blob - base64 (раскодировка)
    #39519299
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KLAYDкомпилируется нормально, но при выполнении select decode_64(t.tm_photo)
from TB_TASK_MESSAGES t (когда я в общем то и передаю в поле значение с типом BLOB), выскакивает ошибка ORA-24813: cannot send or receive an unsupported LOB.

Найди строку на которой падает и посмотри что там
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Blob - base64 (раскодировка)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]