create or replace java source named MY_COMPRESS as import java.io.*; import java.util.zip.*; public class MY_COMPRESS { public static String Inflate( byte[] src ) { try { ByteArrayInputStream bis = new ByteArrayInputStream( src ); InflaterInputStream iis = new InflaterInputStream( bis ); StringBuffer sb = new StringBuffer(); for( int c = iis.read(); c != -1; c = iis.read() ) { sb.append( (char) c ); } return sb.toString(); } catch ( Exception e ) { } return null; } public static byte[] Deflate( String src, int quality ) { try { byte[] tmp = new byte[ src.length() + 100 ]; Deflater defl = new Deflater( quality ); defl.setInput( src.getBytes( "UTF-8" ) ); defl.finish(); int cnt = defl.deflate( tmp ); byte[] res = new byte[ cnt ]; for( int i = 0; i < cnt; i++ ) res[i] = tmp[i]; return res; } catch ( Exception e ) { } return null; } } / alter java source MY_COMPRESS compile / create or replace package mycompress is function deflate( src in varchar2 ) return raw; -- function deflate( src in varchar2, quality in number ) return raw; -- function inflate( src in raw ) return varchar2; -- end; / create or replace package body mycompress is function deflate( src in varchar2 ) return raw is begin return deflate( src, 6 ); end; -- function deflate( src in varchar2, quality in number ) return raw as language java name 'MY_COMPRESS.Deflate( java.lang.String, int ) return byte[]'; -- function inflate( src in raw ) return varchar2 as language java name 'MY_COMPRESS.Inflate( byte[] ) return java.lang.String'; -- end; / declare type tp_tab is table of pls_integer index by pls_integer; t2 tp_tab; cursor c_fill( p_in in varchar2 ) is with src as ( select p_in txt from dual ) , wrap as ( select src.txt , dbms_ddl.wrap( 'create ' || src.txt ) wrap from src ) , subst as ( select substr( utl_encode.base64_decode( utl_raw.cast_to_raw(rtrim( substr( wrap.wrap, instr( wrap.wrap, chr( 10 ), 1, 20 ) + 1 ), chr(10) ) ) ), 41 ) x , mycompress.deflate( wrap.txt || chr(0), 9 ) d from wrap ) select to_number( substr( x, r * 2 - 1, 2 ), 'xx' ) xr , to_number( substr( d, r * 2 - 1, 2 ), 'xx' ) dr from subst , ( select rownum r from dual connect by rownum <= ( select length( x ) / 2 from subst ) ); t varchar2(512); cnt number; procedure fill( p_txt in varchar2, p_from in number, p_to in number, p_extra in varchar2 := null ) is begin for i in p_from .. p_to loop for r_fill in c_fill( p_txt || chr( i ) || p_extra ) loop if ( t2( r_fill.xr ) != -1 and t2( r_fill.xr ) != r_fill.dr ) then dbms_output.put_line( 'error: value maps to two different values ' || p_txt ); dbms_output.put_line( chr( i ) || ' ' || r_fill.xr || ' ' || t2( r_fill.xr ) || ' ' || r_fill.dr ); raise no_data_found; end if; t2( r_fill.xr ) := r_fill.dr; end loop; end loop; end; procedure fill2( p_txt in varchar2 ) is begin for i in 0 .. 99 loop fill( p_txt, ascii( 'a' ), ascii( 'z' ), to_char( i, 'fm999' ) ); fill( p_txt, ascii( 'A' ), ascii( 'Z' ), to_char( i, 'fm999' ) ); end loop; end; -- begin for i in 0 .. 255 loop t2( i ) := -1; end loop; -- dbms_output.put_line( to_char( sysdate, 'hh24:mi:ss' ) ); fill2( 'PACKAGE ' ); -- fill2( 'PACKAGE BODY ' ); -- fill2( 'FUNCTION ' ); -- fill2( 'PROCEDURE ' ); -- fill2( 'TYPE BODY ' ); -- dbms_output.put_line( to_char( sysdate, 'hh24:mi:ss' ) ); cnt := 0; for i in 0 .. 255 loop if t2( i ) != -1 then cnt := cnt + 1; end if; end loop; dbms_output.put_line( 'cnt ' || cnt ); end; / with src as ( select 'PACKAGE BODY anton /* your comments here */ function local_fnc( p_in in varchar2 ) return varchar2 is l_tst varchar2(20); begin l_tst := ''hello world''; return l_tst; end; -- filler procedure xyz is begin null; end; -- filler function global_fnc return number is begin return 3; end; end; ' txt from dual ) , wrap as ( select dbms_ddl.wrap( 'create ' || src.txt ) wrap from src ) , base64_dcd as ( select substr( utl_encode.base64_decode( utl_raw.cast_to_raw(rtrim( substr( wrap.wrap, instr( wrap.wrap, chr( 10 ), 1, 20 ) + 1 ), chr(10) ) ) ), 41 ) x from wrap ) , subst as ( select utl_raw.translate( x, '000102030405060708090A0B0C0D0E0F' || '101112131415161718191A1B1C1D1E1F' || '202122232425262728292A2B2C2D2E2F' || '303132333435363738393A3B3C3D3E3F' || '404142434445464748494A4B4C4D4E4F' || '505152535455565758595A5B5C5D5E5F' || '606162636465666768696A6B6C6D6E6F' || '707172737475767778797A7B7C7D7E7F' || '808182838485868788898A8B8C8D8E8F' || '909192939495969798999A9B9C9D9E9F' || 'A0A1A2A3A4A5A6A7A8A9AAABACADAEAF' || 'B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF' || 'C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF' || 'D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF' || 'E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF' || 'F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF' , '000102030405060708090A0B0C0D0E0F' || -- this is not the real version '101112131415161718191A1B1C1D1E1F' || -- of the table '202122232425262728292A2B2C2D2E2F' || '303132333435363738393A3B3C3D3E3F' || '404142434445464748494A4B4C4D4E4F' || '505152535455565758595A5B5C5D5E5F' || '606162636465666768696A6B6C6D6E6F' || '707172737475767778797A7B7C7D7E7F' || '808182838485868788898A8B8C8D8E8F' || '909192939495969798999A9B9C9D9E9F' || 'A0A1A2A3A4A5A6A7A8A9AAABACADAEAF' || 'B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF' || 'C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF' || 'D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF' || 'E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF' || 'F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF' ) s from base64_dcd ) select mycompress.inflate( s ) from subst drop package mycompress; / drop java source my_compress /