Oracle:如何调用重载过程?

Posted

技术标签:

【中文标题】Oracle:如何调用重载过程?【英文标题】:Oracle: How to call an overloaded procedure? 【发布时间】:2011-05-03 13:05:08 【问题描述】:

如何正确调用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 变体)来避免此错误?

【问题讨论】:

【参考方案1】:

在 Oracle 11G 中,您可以像这样使用命名符号:

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

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

【讨论】:

我收到 ORA-00907:“缺少右括号”错误(我使用的是 Oracle 10g) 确实会的。正如我所说,从 Oracle 11G 开始,您只能在 SQL 中使用命名符号。【参考方案2】:

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

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 字节的密钥 模式。 *操作:指定更长的密钥。


您可以随时尝试使用包装函数(如托尼建议的那样)

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

【讨论】:

我得到 00907. 00000 - “缺少右括号” *原因:*操作: 我认为格式化程序吃了“来自双重” - 请参阅下面的代码示例。 很遗憾没有,我已经添加了“from dual”。 (我使用的是 Oracle 10g) @MRalwasser,修复了双位。我使用的是 11gR2,因此可能会有所不同,请尝试包装函数,但也要查看 Crypto。【参考方案3】:

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

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;

【讨论】:

以上是关于Oracle:如何调用重载过程?的主要内容,如果未能解决你的问题,请参考以下文章

运算符重载

JVM方法调用过程

多态与重载

c#泛型方法重载

开发过程中的Springboot热重载角度8

如果我重载了原始的“operator new”,如何调用它?