CREATE OR REPLACE package compressor is
    function clob_compress(p_clob clob) return blob;
    function clob_decompress(p_blob blob) return clob;
    function blob_compress(p_blob blob) return blob;
    function blob_decompress(p_blob blob) return blob;
end;
/

CREATE OR REPLACE package body compressor is

procedure clob_decompress(p_blob blob, p_clob clob)
as language java
name 'LobCompressor.decompress(oracle.sql.BLOB, oracle.sql.CLOB)';

procedure clob_compress(p_clob clob, p_blob blob)
as language java
name 'LobCompressor.compress(oracle.sql.CLOB, oracle.sql.BLOB)';

procedure blob_decompress(p_slob blob, p_blob blob)
as language java
name 'LobCompressor.decompress(oracle.sql.BLOB, oracle.sql.BLOB)';

procedure blob_compress(p_slob blob, p_blob blob)
as language java
name 'LobCompressor.compress(oracle.sql.BLOB, oracle.sql.BLOB)';

function clob_compress(p_clob clob) return blob is
l_blob blob;
begin
     if p_clob is null then
         return null;
     end if;
     dbms_lob.createtemporary(l_blob,true);
     clob_compress(p_clob,l_blob);
     return l_blob;
end;

function clob_decompress(p_blob blob) return clob is
l_clob clob;
begin
     if p_blob is null then
         return null;
     end if;
     dbms_lob.createtemporary(l_clob,true);
     clob_decompress(p_blob,l_clob);
     return l_clob;
end;

function blob_compress(p_blob blob) return blob is
l_blob blob;
begin
     if p_blob is null then
         return null;
     end if;
     dbms_lob.createtemporary(l_blob,true);
     blob_compress(p_blob,l_blob);
     return l_blob;
end;

function blob_decompress(p_blob blob) return blob is
l_blob blob;
begin
     if p_blob is null then
         return null;
     end if;
     dbms_lob.createtemporary(l_blob,true);
     blob_decompress(p_blob,l_blob);
     return l_blob;
end;

end;
/

