我的包的定义:
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中可以得到正确的结果)但是为什么呢?调用的都是同一个函数啊!是哪里的毛病呢?请各位高手帮帮忙吧,不然俺就没好日子过了!!!
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中可以得到正确的结果)但是为什么呢?调用的都是同一个函数啊!是哪里的毛病呢?请各位高手帮帮忙吧,不然俺就没好日子过了!!!
("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,把类型改一下呢.
刚才我又看了一下程序,发现错误可能在:
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#鳿?誖弗鉳?');
这样就会出错!
大家帮帮我,错误在哪里呢?