|
|
|
Blob - base64 (раскодировка)
|
|||
|---|---|---|---|
|
#18+
Всем привет! Просьба помочь, фотографии хранятся в таблице в поле с типом 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 ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 10:51 |
|
||
|
Blob - base64 (раскодировка)
|
|||
|---|---|---|---|
|
#18+
А вы посмотрите на размер своего буфера после decode. Длина закодированных данных в base64 никак не равна длине исходных данных обычно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 14:43 |
|
||
|
Blob - base64 (раскодировка)
|
|||
|---|---|---|---|
|
#18+
anvanoДлина закодированных данных в base64 никак не равна длине исходных данных обычно. Еще следует ознакомиться с самим представлением base64 - рвать base64-данные на куски произвольным образом не следует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 17:12 |
|
||
|
Blob - base64 (раскодировка)
|
|||
|---|---|---|---|
|
#18+
хммм, попробовал ограничить по длинне 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 11:26 |
|
||
|
Blob - base64 (раскодировка)
|
|||
|---|---|---|---|
|
#18+
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 пустая. Вы её никак не инициализировали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 11:45 |
|
||
|
Blob - base64 (раскодировка)
|
|||
|---|---|---|---|
|
#18+
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 , в итоге вы ошибку и ловите ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 11:47 |
|
||
|
Blob - base64 (раскодировка)
|
|||
|---|---|---|---|
|
#18+
я проверял, во время первого прохода цикла l_buffer = где то 2760 символов, после чего я ограничиваю до 2000 символов, функция валится уже во время первого прохода цикла( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 11:56 |
|
||
|
Blob - base64 (раскодировка)
|
|||
|---|---|---|---|
|
#18+
попробовал другой вариант функции --------------------------------------------------- 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. Никак не пойму в чём затык, вроде во многих примерах как раз подобная функция и приводится... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 16:19 |
|
||
|
Blob - base64 (раскодировка)
|
|||
|---|---|---|---|
|
#18+
KLAYD, используй Java. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2017, 13:30 |
|
||
|
Blob - base64 (раскодировка)
|
|||
|---|---|---|---|
|
#18+
где то стырил, не помню где уже 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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2017, 13:41 |
|
||
|
Blob - base64 (раскодировка)
|
|||
|---|---|---|---|
|
#18+
KLAYD, если не поможет, присылайте структуры таблиц. http://www.sql.ru/forum/935605/zakodirovat-clob-v-base64 https://erikwramner.wordpress.com/2010/02/23/coding-and-decoding-base64-in-plsql/ готовый пакет - декодер http://wonderingmisha.blogspot.ru/2011/05/base64-encoding-in-plsql.html http://www.dba-oracle.com/t_convert_to_blob_datatype.htm подробно разбирает статьи в рунете. http://apps-oracle.ru/lob_oracle/ https://www.google.ru/search?q=большие обьекты Oracle&oq=большие обьекты Oracle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 19:01 |
|
||
|
Blob - base64 (раскодировка)
|
|||
|---|---|---|---|
|
#18+
KLAYDкомпилируется нормально, но при выполнении select decode_64(t.tm_photo) from TB_TASK_MESSAGES t (когда я в общем то и передаю в поле значение с типом BLOB), выскакивает ошибка ORA-24813: cannot send or receive an unsupported LOB. Найди строку на которой падает и посмотри что там ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2017, 16:18 |
|
||
|
|

start [/forum/topic.php?fid=52&tid=1885281]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
156ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 422ms |

| 0 / 0 |
