Oracle:如何调用重载过程?

时间:2011-05-03 13:05:08

标签: sql oracle encryption plsql ora-06553

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

select DBMS_OBFUSCATION_TOOLKIT.DESEncrypt('x','y') from dual;

不起作用,因为DESEncrypt过载:

ORA-06553: PLS-307: Too many declarations of "DESENCRYPT" match this call
06553. 00000 -  "PLS-%s: %s"
*Cause:    
*Action:

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

3 个答案:

答案 0 :(得分:9)

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

select DBMS_OBFUSCATION_TOOLKIT.DESEncrypt(input_string=>'x',key_string=>'y')
from dual;

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

答案 1 :(得分:7)

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

select DBMS_OBFUSCATION_TOOLKIT.DesEncrypt(INPUT_STRING=>'11112abc',KEY_STRING=>'4578ccde') 
from dual ;

返回

  

M5w5Z

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

  

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


你总是可以尝试使用包装函数(如tony所示)

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

答案 2 :(得分:2)

这是使用旧dbms_obfuscation_toolkit的crypt / decrypt:

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;

对于解密:

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;

用法:

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;