如何从一个的base64 + 32K大小BLOB解码与PL / SQL原值?

问题描述 投票:0回答:1

- 该功能的目的为base64团块解码为原来的值,即使我使用的4个字节倍数或(24位)的缓冲液I仍然得到无效结果。

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

- 准备临时LOB和计算BLOB大小

                    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;
oracle plsql base64 clob
1个回答
0
投票

尝试改变这一点:

dbms_lob.writeappend(v_temp_blob, v_base64_buff, v_raw_buff );

dbms_lob.writeappend(lob_loc => v_temp_blob,
                     amount  => v_blob_size/4,
                     buffer  => v_raw_buff);
© www.soinside.com 2019 - 2024. All rights reserved.