我的包的定义:
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;
procedure setKey(p_key in varchar2);
end;该包在sqlplus worksheet中调用能够成功!但是在java中调用就会出现两个问题:
在java 下的调用代码如下://////调用包里的加密函数加密字符串
OracleCallableStatement stmt = (OracleCallableStatement)conn.prepareCall("begin ?:=crypt_pkg.encryptString(?,?);end;");
                      stmt.registerOutParameter(1,java.sql.Types.VARCHAR);
                      stmt.setString(2,"zhaohuav");
                      stmt.setString(3,"MagicKey");
                      boolean b=stmt.execute();
                      String myresult=stmt.getString(1);
                      String mychar=myresult.toString();
                      System.out.println(myresult);
                      System.out.println(mychar);
                      stmt.close();///////调用包里的解密函数解密字符串
                      OracleCallableStatement stmt1 = (OracleCallableStatement)conn.prepareCall("begin ?:=crypt_pkg.decryptString(?,?);end;");
                      stmt1.registerOutParameter(1,java.sql.Types.VARCHAR);
                      stmt1.setString(2,myresult);
                      stmt1.setString(3,"MagicKey");
                      boolean b1=stmt1.execute();
                      String mystr=stmt1.getString(1);
                      stmt1.close();
                      String mystr1=mystr.toString().trim();
                      System.out.println(mystr);
    }  第一个问题是:当调用加密函数的时候,返回的值应该是正确的,因为我在sqlplus worksheet中可以得到相同的值。但是boolean b=stmt.execute()的返回值却是false,不知道为什么?
第二个问题:把加密函数得到的值放到解密函数中去解密,得到的结果却是错误的!(在sqlplus worksheet中可以得到正确的结果)但是为什么呢?调用的都是同一个函数啊!是哪里的毛病呢?请各位高手帮帮忙吧,不然俺就没好日子过了!!!

解决方案 »

  1.   

    ....
    ("begin ?:=crypt_pkg.encryptString(?,?);end;");
                          stmt.registerOutParameter(1,java.sql.Types.VARCHAR);
                          stmt.setString(2,"zhaohuav");
                          stmt.setString(3,"MagicKey");
                          boolean b=stmt.execute();       <-------这里
    ....调用的encryptString函数返回的varchar2类型.但是却用了boolean b变量来接受varchar2,把类型改一下呢.
      

  2.   

    谢谢dinya2003(OK) ,但是stmt.execute()的类型是布尔型的,判断执行成不成功。
    刚才我又看了一下程序,发现错误可能在:
    stmt1.registerOutParameter(1,java.sql.Types.VARCHAR);
    stmt1.setString(2,myresult);<-----------------这里!
    stmt1.setString(3,"MagicKey");也就是说,虽然加密后的字串是myresult,但是如果直接回传给oracle中的解密函数的话,就会产生错误,应该给它转换一下类型可能就行了!
    顺便我把解密函数也写出来吧,大家看一下: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;而在sqlplusworksheet中的调试程序是:
    set serveroutput on
    declare
    l_str_data varchar2(25):='helloworld';
    l_str_enc varchar2(50);
    l_str_decoded varchar2(25);
    begin
    crypt_pkg.setKey('MagicKey');
    l_str_enc:=crypt_pkg.encryptString(l_str_data);     <-----(1)
    l_str_decoded:=crypt_pkg.decryptString(l_str_enc);
    dbms_output.put_line('Encode In hex='||l_str_enc);
    dbms_output.put_line('Decode='||l_str_decoded);
    end;
    这样可以执行成功。但是如果这样执行就会出错:
    比如l_str_enc在(1)中得到的结果是:nmFO#鳿?誖弗鉳?
    然后执行:l_str_decoded:=crypt_pkg.decryptString('nmFO#鳿?誖弗鉳?');
    这样就会出错!
    大家帮帮我,错误在哪里呢?