首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle:如何调用重载过程?

Oracle:如何调用重载过程?
EN

Stack Overflow用户
提问于 2011-05-03 21:05:08
回答 3查看 7.5K关注 0票数 3

如何正确调用DBMS_OBFUSCATION_TOOLKIT.DESEncrypt?(如果可能,不使用PL/SQL )

代码语言:javascript
复制
select DBMS_OBFUSCATION_TOOLKIT.DESEncrypt('x','y') from dual;

无法工作,因为DESEncrypt过载了:

代码语言:javascript
复制
ORA-06553: PLS-307: Too many declarations of "DESENCRYPT" match this call
06553. 00000 -  "PLS-%s: %s"
*Cause:    
*Action:

有没有办法选择DESENCRYPT的一个实现(可能是VARCHAR2变体)来避免这个错误?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-03 21:13:06

在这里,只需通过提供参数名称让它知道要使用哪个重载!

代码语言:javascript
复制
select DBMS_OBFUSCATION_TOOLKIT.DesEncrypt(INPUT_STRING=>'11112abc',KEY_STRING=>'4578ccde') 
from dual ;

返回

M5��w5Z

注意,您的密钥至少需要8个字节:

ORA- 28234 :密钥长度太短ORA-06512:在"SYS.DBMS_OBFUSCATION_TOOLKIT_FFI",第21行ORA-06512:在"SYS.DBMS_OBFUSCATION_TOOLKIT",第126 28234行。00000 -“密钥长度太短”*原因:指定的密钥对于算法来说太短。DES需要至少8个字节的密钥。三重DES在双密钥模式下需要至少16字节的密钥,在三密钥模式下至少需要24字节的密钥。*操作:指定一个更长的密钥。

您可以尝试使用包装器函数(如tony建议的那样)。

代码语言:javascript
复制
create or replace
function DesEncrypt(pinputString IN VARCHAR2 , pKeyString in VARCHAR2) RETURN varchar2
IS
BEGIN
return DBMS_OBFUSCATION_TOOLKIT.DesEncrypt(INPUT_STRING=>INPUTSTRING,KEY_STRING=>KEYSTRING);
END DesEncrypt;
/
select DesEncrypt('11112abc' , '4578ccde') from dual ;

由于您使用的是10g,因此可能需要使用DBMS_CRYPTO包http://www.stanford.edu/dept/itss/docs/oracle/10g/network.101/b10773/apdvncrp.htm

票数 7
EN

Stack Overflow用户

发布于 2011-05-03 21:13:38

在Oracle 11G中,您可以使用如下命名表示法:

代码语言:javascript
复制
select DBMS_OBFUSCATION_TOOLKIT.DESEncrypt(input_string=>'x',key_string=>'y')
from dual;

我认为在早期版本的Oracle中不可能明确地调用这些函数,除非创建一个包装函数并调用它。

票数 9
EN

Stack Overflow用户

发布于 2011-05-03 22:31:21

这是一个使用旧dbms_obfuscation_toolkit的加密/解密:

代码语言:javascript
复制
create or replace function crypt(p_str in varchar2, p_key in varchar2) return varchar2
as
  l_data varchar2(255);
begin
  l_data := rpad(p_str, (trunc(length(p_str)/8)+1)*8,chr(0));
  dbms_obfuscation_toolkit.DESEncrypt
  (input_string=>l_data,
  key_string=>p_key,
  encrypted_string=>l_data);

  return l_data;
end;

对于解密:

代码语言:javascript
复制
create or replace function decrypt(p_str in varchar2, p_key in varchar2) return varchar2
as
  l_data varchar2(255);
begin
  dbms_obfuscation_tookit.DESDecrypt
  (input_string=>p_str,
  key_string=>p_key,
  decrypted_string=>l_data);

  return rtrim(l_data,chr(0));
end;

和用法:

代码语言:javascript
复制
declare

  l_data varchar2(100);
  l_key varchar2(100);
  l_encrypted varchar2(100);
  l_decrypted varchar2(100);

begin
  l_data := 'This is secret!!!';
  l_key := 'My secret key';
  dbms_output.put_line(l_data);

  l_encrypted := crypt(l_data, l_key);
  dbms_output.put_line(l_encrypted);

  l_decrypted := decrypt(l_encrypted, l_key);
  dbms_output.put_line(l_decrypted);

end;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5869881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档