alexandria-plsql-utils/ora/encode_util_pkg.pkb
2015-02-20 19:43:42 +01:00

221 lines
5.5 KiB
Plaintext
Executable File

create or replace package body encode_util_pkg
as
/*
Purpose: Package contains utility functions related to encoding/decoding (of strings)
Remarks:
Who Date Description
------ ---------- --------------------------------
MBR 11.05.2011 Created
*/
function str_to_base64 (p_str in varchar2) return varchar2
as
l_returnvalue string_util_pkg.t_max_pl_varchar2;
begin
/*
Purpose: encode string using base64
Remarks: http://stackoverflow.com/questions/3804279/base64-encoding-and-decoding-in-oracle/3806265#3806265
Who Date Description
------ ---------- --------------------------------
MBR 11.05.2011 Created
*/
l_returnvalue := utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(p_str)));
return l_returnvalue;
end str_to_base64;
function clob_to_base64 (p_clob in clob) return clob
as
l_pos pls_integer := 1;
l_buffer varchar2 (32767);
l_lob_len integer := dbms_lob.getlength (p_clob);
l_width pls_integer := (76 / 4 * 3)-9;
l_returnvalue clob;
begin
/*
Purpose: encode clob using base64
Remarks:
Who Date Description
------ ---------- --------------------------------
MBR 11.05.2011 Created
*/
if p_clob is not null then
dbms_lob.createtemporary (l_returnvalue, true);
dbms_lob.open (l_returnvalue, dbms_lob.lob_readwrite);
while (l_pos < l_lob_len) loop
l_buffer := utl_raw.cast_to_varchar2 (utl_encode.base64_encode (dbms_lob.substr (p_clob, l_width, l_pos)));
dbms_lob.writeappend (l_returnvalue, length (l_buffer), l_buffer);
l_pos := l_pos + l_width;
end loop;
end if;
return l_returnvalue;
end clob_to_base64;
function blob_to_base64 (p_blob in blob) return clob
as
l_pos pls_integer := 1;
l_buffer varchar2 (32767);
l_lob_len integer := dbms_lob.getlength (p_blob);
l_width pls_integer := (76 / 4 * 3)-9;
l_returnvalue clob;
begin
/*
Purpose: encode blob using base64
Remarks: based on Jason Straub's blob2clobbase64 in package flex_ws_api (aka apex_web_service)
Who Date Description
------ ---------- --------------------------------
MBR 11.05.2011 Created
*/
dbms_lob.createtemporary (l_returnvalue, true);
dbms_lob.open (l_returnvalue, dbms_lob.lob_readwrite);
while (l_pos < l_lob_len) loop
l_buffer := utl_raw.cast_to_varchar2 (utl_encode.base64_encode (dbms_lob.substr (p_blob, l_width, l_pos)));
dbms_lob.writeappend (l_returnvalue, length (l_buffer), l_buffer);
l_pos := l_pos + l_width;
end loop;
return l_returnvalue;
end blob_to_base64;
function base64_to_str (p_str in varchar2) return varchar2
as
l_returnvalue string_util_pkg.t_max_pl_varchar2;
begin
/*
Purpose: decode base64-encoded string
Remarks: http://stackoverflow.com/questions/3804279/base64-encoding-and-decoding-in-oracle/3806265#3806265
Who Date Description
------ ---------- --------------------------------
MBR 11.05.2011 Created
*/
l_returnvalue := utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw(p_str)));
return l_returnvalue;
end base64_to_str;
function base64_to_clob (p_clob in varchar2) return clob
as
l_pos pls_integer := 1;
l_buffer raw(36);
l_buffer_str varchar2(2000);
l_lob_len integer := dbms_lob.getlength (p_clob);
l_width pls_integer := (76 / 4 * 3)-9;
l_returnvalue clob;
begin
/*
Purpose: decode base64-encoded clob
Remarks:
Who Date Description
------ ---------- --------------------------------
MBR 11.05.2011 Created
*/
if p_clob is not null then
dbms_lob.createtemporary (l_returnvalue, true);
dbms_lob.open (l_returnvalue, dbms_lob.lob_readwrite);
while (l_pos < l_lob_len) loop
l_buffer := utl_encode.base64_decode(utl_raw.cast_to_raw(dbms_lob.substr (p_clob, l_width, l_pos)));
l_buffer_str := utl_raw.cast_to_varchar2(l_buffer);
dbms_lob.writeappend (l_returnvalue, length(l_buffer_str), l_buffer_str);
l_pos := l_pos + l_width;
end loop;
end if;
return l_returnvalue;
end base64_to_clob;
function base64_to_blob (p_clob in clob) return blob
as
l_pos pls_integer := 1;
l_buffer raw(36);
l_lob_len integer := dbms_lob.getlength (p_clob);
l_width pls_integer := (76 / 4 * 3)-9;
l_returnvalue blob;
begin
/*
Purpose: decode base64-encoded clob to blob
Remarks: based on Jason Straub's clobbase642blob in package flex_ws_api (aka apex_web_service)
Who Date Description
------ ---------- --------------------------------
MBR 11.05.2011 Created
*/
dbms_lob.createtemporary (l_returnvalue, true);
dbms_lob.open (l_returnvalue, dbms_lob.lob_readwrite);
while (l_pos < l_lob_len) loop
l_buffer := utl_encode.base64_decode(utl_raw.cast_to_raw(dbms_lob.substr (p_clob, l_width, l_pos)));
dbms_lob.writeappend (l_returnvalue, utl_raw.length(l_buffer), l_buffer);
l_pos := l_pos + l_width;
end loop;
return l_returnvalue;
end base64_to_blob;
end encode_util_pkg;
/