# UTL_BASE64 ## Package Specification ```sql PACKAGE "UTL_BASE64" is function decode_base64(p_clob_in in clob) return blob; function encode_base64(p_blob_in in blob) return clob; FUNCTION encodeBlob2Base64(pBlobIn IN BLOB) RETURN BLOB; FUNCTION decodeBase642Blob(pBlobIn IN BLOB) RETURN BLOB; function base64encode(p_blob in blob) return clob; end; ``` ## Package Body ```sql PACKAGE BODY "UTL_BASE64" is function decode_base64(p_clob_in in clob) return blob is v_blob blob; v_result blob; v_offset integer; v_buffer_size binary_integer := 48; v_buffer_varchar varchar2(48); v_buffer_raw raw(48); begin if p_clob_in is null then return null; end if; dbms_lob.createtemporary(v_blob, true); v_offset := 1; for i in 1 .. ceil(dbms_lob.getlength(p_clob_in) / v_buffer_size) loop dbms_lob.read(p_clob_in, v_buffer_size, v_offset, v_buffer_varchar); v_buffer_raw := utl_raw.cast_to_raw(v_buffer_varchar); 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_result := v_blob; dbms_lob.freetemporary(v_blob); return v_result; end decode_base64; function encode_base64(p_blob_in in blob) return clob is v_clob clob; v_result clob; v_offset integer; v_chunk_size binary_integer := (48 / 4) * 3; v_buffer_varchar varchar2(48); v_buffer_raw raw(48); begin if p_blob_in is null then return null; end if; dbms_lob.createtemporary(v_clob, true); v_offset := 1; for i in 1 .. ceil(dbms_lob.getlength(p_blob_in) / v_chunk_size) loop dbms_lob.read(p_blob_in, v_chunk_size, v_offset, v_buffer_raw); v_buffer_raw := utl_encode.base64_encode(v_buffer_raw); v_buffer_varchar := utl_raw.cast_to_varchar2(v_buffer_raw); dbms_lob.writeappend(v_clob, length(v_buffer_varchar), v_buffer_varchar); v_offset := v_offset + v_chunk_size; end loop; v_result := v_clob; dbms_lob.freetemporary(v_clob); return v_result; end encode_base64; FUNCTION encodeBlob2Base64(pBlobIn IN BLOB) RETURN BLOB IS vAmount NUMBER := 45; vBlobEnc BLOB := empty_blob(); vBlobEncLen NUMBER := 0; vBlobInLen NUMBER := 0; vBuffer RAW(45); vOffset NUMBER := 1; BEGIN -- dbms_output.put_line('Start base64 encoding.'); vBlobInLen := dbms_lob.getlength(pBlobIn); -- dbms_output.put_line('' || vBlobInLen); dbms_lob.createtemporary(vBlobEnc, TRUE); LOOP IF vOffset >= vBlobInLen THEN EXIT; END IF; dbms_lob.read(pBlobIn, vAmount, vOffset, vBuffer); BEGIN dbms_lob.append(vBlobEnc, utl_encode.base64_encode(vBuffer)); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('' || vAmount || '' || vOffset || '' || vBuffer); dbms_output.put_line('ERROR IN append: ' || SQLERRM); RAISE; END; vOffset := vOffset + vAmount; END LOOP; vBlobEncLen := dbms_lob.getlength(vBlobEnc); -- dbms_output.put_line('' || vBlobEncLen); -- dbms_output.put_line('Finshed base64 encoding.'); RETURN vBlobEnc; END encodeBlob2Base64; FUNCTION decodeBase642Blob(pBlobIn IN BLOB) RETURN BLOB IS vAmount NUMBER := 256;--32; vBlobDec BLOB := empty_blob(); vBlobDecLen NUMBER := 0; vBlobInLen NUMBER := 0; vBuffer RAW(256);--32); vOffset NUMBER := 1; BEGIN -- dbms_output.put_line('Start base64 decoding.'); vBlobInLen := dbms_lob.getlength(pBlobIn); -- dbms_output.put_line('' || vBlobInLen); dbms_lob.createtemporary(vBlobDec, TRUE); LOOP IF vOffset >= vBlobInLen THEN EXIT; END IF; dbms_lob.read(pBlobIn, vAmount, vOffset, vBuffer); BEGIN dbms_lob.append(vBlobDec, utl_encode.base64_decode(vBuffer)); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('' || vAmount || '' || vOffset || '' || vBuffer); dbms_output.put_line('ERROR IN append: ' || SQLERRM); RAISE; END; vOffset := vOffset + vAmount; END LOOP; vBlobDecLen := dbms_lob.getlength(vBlobDec); -- dbms_output.put_line('' || vBlobDecLen); -- dbms_output.put_line('Finshed base64 decoding.'); RETURN vBlobDec; END decodeBase642Blob; function base64encode(p_blob in blob) return clob is CRLF constant varchar2(2) := chr(13)||chr(10); l_clob clob; l_amount integer := 23826; l_offset integer := 1; l_raw raw(32767); l_buf varchar2(32767); l_len integer := dbms_lob.getlength(p_blob); begin dbms_lob.createtemporary(l_clob, true, dbms_lob.call); while l_offset <= l_len loop dbms_lob.read(p_blob, l_amount, l_offset, l_raw); l_offset := l_offset + l_amount; l_buf := utl_raw.cast_to_varchar2(utl_encode.base64_encode(l_raw)); l_buf := replace(l_buf, CRLF); dbms_lob.writeappend(l_clob, length(l_buf), l_buf); end loop; return l_clob; end base64encode; end; ```