Как декодировать BLOB размером + 32 КБ из base64 в исходное значение с помощью pl / sql? - PullRequest
0 голосов
/ 04 февраля 2019

- эта функция предназначена для декодирования BLOB-объекта base64 до исходного значения, даже если я использую буфер, кратный 4 байтам или (24 бита), я все еще получаю недопустимые результаты.

FUNCTION base64_blob_decode(p_blob BLOB)
                              RETURN BLOB                  

        IS
                          v_result_blob BLOB;
                          v_blob BLOB;
                          v_temp_blob BLOB;
                          v_buff binary_integer;
                          v_raw_buff raw(32676);
                          v_blob_size   INTEGER;
                          v_start_pos   INTEGER := 1;
                          v_base64_buff INTEGER;
                        BEGIN

-- подготовка временного объекта и вычисление размера большого двоичного объекта

                    v_blob_size := LENGTH(p_blob);
                          dbms_output.put_line('v_blob_size'||v_blob_size);
                          dbms_lob.createtemporary(v_blob,false);
                          dbms_lob.createtemporary(v_temp_blob,false);
                          v_blob              := p_blob; 

- если размер большого двоичного объекта превышает нулевой цикл для его декодирования

                          IF LENGTH(p_blob )   > 0 THEN
                            WHILE (v_blob_size > 0)
                            LOOP
  -- this part is to adjust the buffer size to the size of the last part
                -- the buffer size is multiple of 4 
                IF v_blob_size < 31992 AND v_blob_size > 0 THEN
                                v_buff      := v_blob_size;
                              ELSE
                                v_buff := 31992; 
                              END IF;
                read the buffer size in raw
                              v_raw_buff := DBMS_LOB.SUBSTR (v_blob , v_buff,v_start_pos);
                              v_raw_buff := UTL_ENCODE.BASE64_DECODE(v_raw_buff);
                              dbms_lob.writeappend(v_temp_blob, v_base64_buff, v_raw_buff );
                              v_start_pos :=v_start_pos  +v_buff;
                              v_blob_size := v_blob_size - v_buff;
                            END LOOP;

- вернуть результат blob

    v_result_blob := v_temp_blob;
    -- close the temporary blobs
                            dbms_lob.freetemporary(v_temp_blob);
                            dbms_lob.freetemporary(v_blob);
                          END IF;
                          RETURN v_result_blob;
                        EXCEPTION
                        WHEN OTHERS THEN
                          DBMS_OUTPUT.PUT_LINE('base64_blob_decode- SQLERRM:'||SQLERRM);
                          RETURN NULL;
                        END base64_blob_decode;

1 Ответ

0 голосов
/ 04 февраля 2019

Попробуйте изменить это:

dbms_lob.writeappend(v_temp_blob, v_base64_buff, v_raw_buff );

TO

dbms_lob.writeappend(lob_loc => v_temp_blob,
                     amount  => v_blob_size/4,
                     buffer  => v_raw_buff);
...