CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Oracle >  高级技术

紧急!!请各位高手帮忙解决!java中调用oracle函数的问题

楼主zhwind(风)2004-08-02 12:52:26 在 Oracle / 高级技术 提问

我的包的定义:  
  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中可以得到正确的结果)但是为什么呢?调用的都是同一个函数啊!是哪里的毛病呢?请各位高手帮帮忙吧,不然俺就没好日子过了!!!  
   
  问题点数:0、回复次数:5Top

1 楼zhwind(风)回复于 2004-08-02 14:31:07 得分 0

小弟在线等着呢,大家帮帮我吧,提点意见,顶一下也好啊Top

2 楼dinya2003(OK)回复于 2004-08-02 14:48:21 得分 0

....  
  ("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,把类型改一下呢.Top

3 楼zhwind(风)回复于 2004-08-02 16:05:14 得分 0

谢谢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#鳿?誖弗鉳?');  
  这样就会出错!  
  大家帮帮我,错误在哪里呢?  
   
  Top

4 楼zhwind(风)回复于 2004-08-03 08:53:36 得分 0

再顶一下!Top

5 楼zhwind(风)回复于 2004-08-03 16:27:03 得分 0

大家都没遇到过这种情况吗,怎么没人回复呢?Top

相关问题

  • java,JDBC中可以调用ORACLE中的过程与函数吗?
  • java调用oracle函数错误,请指教
  • java里怎么调用自己写的oracle函数
  • 如何编写oracle的存储过程、函数?并在java jsp页面中调用?java 调用oracle function出错!!
  • asp调用oracle后台函数怎么调用
  • java怎么调用数据库函数
  • 函数调用
  • 函数调用
  • 调用函数
  • 函数调用

关键词

  • 函数
  • 解密
  • 加密
  • sql
  • 调用
  • stmt
  • oraclecallablestatement
  • magickey
  • setstring
  • myresult

得分解答快速导航

  • 帖主:zhwind

相关链接

  • Oracle类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo