extracted objects
This commit is contained in:
168
docs/packages/UTL_BASE64.md
Normal file
168
docs/packages/UTL_BASE64.md
Normal file
@@ -0,0 +1,168 @@
|
||||
# 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;
|
||||
|
||||
```
|
||||
Reference in New Issue
Block a user