首页 > Linux操作系统 > Linux操作系统 > 能超过4000字的unwrap
set serveroutput on;
CREATE TABLE SYS.IDLTRANSLATE
(
C_BASE64DECODE VARCHAR2(2) NOT NULL,
C_LZDEFLATECODE VARCHAR2(2) NULL
)
需要确保对照表恰好有256行不同的
我是运行1次'PACKAGE' 1次'FUNCTION'得到的
为了输出中文,要修改java过程
alter java source UNWRAPPER compile
/
然后用包把JAVA声明进来:
create or replace package amosunwrapper
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 amosunwrapper
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 'UNWRAPPER.Deflate( java.lang.String, int ) return byte[]';
function inflate( src in raw )
return varchar2
as language java
name 'UNWRAPPER.Inflate( byte[] ) return java.lang.String';
end;
/
create or replace procedure unwrap(o in varchar,n in varchar, t in varchar)
as
vWrappedtext Varchar2(32767);
vtrimtext Varchar2(32767);
vChar Varchar2(2);
vRepchar Varchar2(2);
vLZinflatestr Varchar2(32767);
nLen Integer;
nLoop Integer;
nCnt Integer;
type vartab is table of varchar2(2) index by varchar2(2);
mytbl vartab;
cursor getchar is select C_BASE64DECODE xr,C_LZDEFLATECODE dr from sys.idltranslate;
Begin
for i in getchar loop --sys.idltranslate表内容存到字符数组
mytbl(i.xr):=i.dr;
end loop;
vtrimtext:='';
select count(*) into ncnt from DBA_SOURCE
Where wner=o
And Name = n
And Type=t ;
if ncnt >0 and ncnt <5 then
for i in 1..ncnt loop
if i=1 then
select rtrim( substr( TEXT, instr( TEXT, chr( 10 ), 1, 20 ) + 1 ), chr(10) ) --保存去掉换行的BASE64码正文
into vLZinflatestr
from DBA_SOURCE
Where wner=o
And Name = n
And Type=t and line=i;
else
select text into vLZinflatestr
from DBA_SOURCE
Where wner=o
And Name = n
And Type=t and line=i;
end if;
vtrimtext:=vtrimtext||vLZinflatestr;
end loop;
end if;
vtrimtext:=replace(vtrimtext,chr(10),'');
nLen := Length(vtrimtext)/64 ;
vWrappedtext :='';
for i in 0..nLen loop
if i< nLen then
vWrappedtext:=vWrappedtext||utl_encode.base64_decode( utl_raw.cast_to_raw(substrb(vtrimtext,64*i+1 , 64 ))) ;
else
vWrappedtext:=vWrappedtext||utl_encode.base64_decode( utl_raw.cast_to_raw(substrb(vtrimtext,64*i+1 ))) ;
end if;
--DBMS_OUTPUT.PUT_LINE(vWrappedtext);
End Loop;
--vWrappedtext:=substr(vWrappedtext,41);
nLen := Length(vWrappedtext)/2 - 1;
vLZinflatestr :='';
For nLoop In 20..nLen Loop --从第41字节开始
vChar := Substrb(vWrappedtext,nLoop*2+1,2);
/*
Select Count(*) Into nCnt From SYS.IDLTRANSLATE Where C_BASE64DECODE=vChar;
If nCnt <> 1 Then
DBMS_OUTPUT.PUT_LINE('SUBSTATION TABLE WARNING: Count not find following char--'||vChar);
Return;
Else
Select C_LZDEFLATECODE Into vRepchar From SYS.IDLTRANSLATE Where C_BASE64DECODE=vChar;
End If;
*/
vLZinflatestr := vLZinflatestr || mytbl(vChar); --从字符数组匹配
--DBMS_OUTPUT.PUT_LINE(vLZinflatestr);
End Loop;
--DBMS_OUTPUT.PUT_LINE(vLZinflatestr);
DBMS_OUTPUT.PUT_LINE(amosunwrapper.inflate(vLZinflatestr));
End;
/
exec unwrap('SYS','HANMON','PACKAGE BODY');
----------------------------------------------------------------------------------------
/
conn sys/sys@orcl as sysdba
set lines 132 pages 50000 timi on
set serverout on
exec unwrap('SYS','HANMON','PACKAGE BODY');
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13165828/viewspace-606012/ ,如需转载,请注明出处,否则将追究法律责任。