169 lines
5.3 KiB
Markdown
169 lines
5.3 KiB
Markdown
# 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('<BlobInLength>' || 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>' || vAmount || '<vOffset>' || vOffset || '<vBuffer>' || 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('<BlobEncLength>' || 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('<BlobInLength>' || 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>' || vAmount || '<vOffset>' || vOffset || '<vBuffer>' || 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('<BlobDecLength>' || 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;
|
|
|
|
```
|