下面是《oracle 专家高级编程》中的一个例子,我的是oracle 9.0.111,在sqlplus worksheet中执行的时候没有结果输出,但此时oracle进程却占用了90%多得cpu进程。请各位高手看看是哪里的毛病啊。大家可以在自己的oracle的里sqlplus worksheet里试一下,看看有没有输出阿。版本应该在orcale8.1.7以上才行。
set serveroutput on
///////////////////程序包定义/////////////////////////////////////
create or replace package crypt_pkg
as
function encryptString(p_data in varchar2,p_key in varchar2 default NULL) return varchar2;
function decryptString(p_data in varchar2,p_key in varchar2 default NULL) return varchar2;
subtype checksum_str is varchar2(16);function md5str(p_data in varchar2) return checksum_str;
procedure setKey(p_key in varchar2);
end;
////////////////////程序包主体/////////////////////////////////////
create or replace package body crypt_pkg
as
g_charkey varchar2(48);
g_stringFunction varchar2(1);
g_rawFunction varchar2(1);
g_stringWhich varchar2(75);
g_rawWhich varchar2(75);
g_chunkSize  CONSTANT number default 32000;function padstr(p_str in varchar2) return varchar2
as
l_len number default length(p_str);
begin
return to_char(l_len,'fm00000009')||rpad(p_str,(trunc(l_len/8)+sign(mod(l_len,8)))*8,chr(0));
end;function unpadstr(p_str in varchar2) return varchar2
is
begin
return substr(p_str,9,to_number(substr(p_str,1,8)));
end;procedure setKey(p_key in varchar2)
as
begin
if(g_charkey=p_key OR p_key is NULL) then
return;
end if;
g_charkey:=p_key;if(length(g_charkey) not in (8,16,24,16,32,48))
then
raise_application_error(-20001,'Key must be 8,16,or 24 bytes');
end if;select decode(length(g_charkey),8,'','3'),decode(length(g_charkey),8,'',16,'',24,',which=>DBMS_OBFUSCATION_TOOLKIT.ThreeKeyMode'),
decode(length(g_charkey),16,'','3'),decode(length(g_charkey),16,'',32,'',48,',which=>DBMS_OBFUSCATION_TOOLKIT.ThreeKeyMode')
into g_stringFunction,g_stringWhich,g_rawFunction,g_rawWhich
from dual;
end;function encryptString(p_data in varchar2,p_key in varchar2 default NULL) return varchar2
as
l_encrypted long;
begin
setkey(p_key);
execute immediate
'begin
DBMS_OBFUSCATION_TOOLKIT.des'||g_stringFunction||'encrypt
(input_string=>:1,key_string=>:2,encrypt_string=>:3'||g_stringWhich||');
end;'
using IN padstr(p_data),IN g_charkey,IN OUT l_encrypted;
return l_encrypted;
end;function decryptString(p_data in varchar2,p_key in varchar2 default NULL) return varchar2
as
l_string long;
begin
setkey(p_key);
execute immediate
'begin
DBMS_OBFUSCATION_TOOLKIT.des'||g_stringFunction||'decrypt(input_string=>:1,key_string=>:2,decrypted_string=>:3'||
g_stringWhich||');
end;'
using IN p_data,IN g_charkey,IN OUT l_string;
return unpadstr(l_string);
end;function md5str(p_data in varchar2) return checksum_str
is
l_checksum_str checksum_str;
begin
execute immediate
'begin:x:=DBMS_OBFUSCATION_TOOLKIT.md5(input_string=>:y);end;'
using OUT l_checksum_str,IN p_data;return l_checksum_str;
end;
end;
/
show errors/////////////////////执行/////////////////////////
declare
l_str_data varchar2(25):='hello world';
l_str_enc varchar2(50);
l_str_decoded varchar2(25);
begin
crypt_pkg.setKey('MagicKey');
l_str_enc:=crypt_pkg.encryptString(l_str_data);
l_str_decoded:=crypt_pkg.decryptString(l_str_enc);
dbms_output.put_line('Encode In hex='||utl_raw.cast_to_raw(l_str_enc));
dbms_output.put_line('Decode='||l_str_decoded);
end;

解决方案 »

  1.   

    创建的过程中是否正常?看看你创建的包的状态是不是正常的,可以从控制台中查看。最好用plsqldev之类的工具对你的测试程序进行跟踪。
      

  2.   

    在sqlplus worksheet中创建的时候,一切都很正常阿,我在plsqldev上看看吧,不过plsqldev在哪里找到呢?
      

  3.   

    我知道是哪里的问题了。问题在这里:
    function padstr(p_str in varchar2) return varchar2
    as
    l_len number default length(p_str);
    begin
    return to_char(l_len,'fm00000009')||rpad(p_str,(trunc(l_len/8)+sign(mod(l_len,8)))*8,chr(0));
    end;将return to_char(l_len,'fm00000009')||rpad(p_str,(trunc(l_len/8)+sign(mod(l_len,8)))*8,chr(0));中的chr(0)改为'0',即可通过运行,但是我不知道这是为什么!有人可以给我解释一下吗?