Oracle: ¿Cómo llamar a un procedimiento sobrecargado?

Cómo llamar correctamente a DBMS_OBFUSCATION_TOOLKIT.DESEncrypt ? (sin usar PL / SQL si es posible)

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

no funciona porque DESEncrypt está sobrecargado:

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

¿Hay alguna manera de elegir una implementación de DESENCRYPT (posiblemente la variante VARCHAR2) para evitar este error?

¡aquí tienes, solo dile qué sobrecarga usar usando los nombres de param!

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

devoluciones

M5 w5Z

tenga en count que su key debe tener al less 8 bytes:

ORA-28234: longitud de key demasiado corta ORA-06512: en "SYS.DBMS_OBFUSCATION_TOOLKIT_FFI", línea 21 ORA-06512: en "SYS.DBMS_OBFUSCATION_TOOLKIT", línea 126 28234. 00000 – "longitud de key demasiado corta" * Causa: la key especificada es demasiado corto para el algorithm. DES requiere una key de al less 8 bytes. Triple DES requiere una key de al less 16 bytes en el modo de dos teclas y 24 bytes en el modo de tres teclas. * Acción: especifique una key más larga.


Siempre puedes probarlo con una function de envoltura (como se sugirió 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 ; 

Dado que tiene 10g, es posible que desee utilizar el package DBMS_CRYPTO http://www.stanford.edu/dept/itss/docs/oracle/10g/network.101/b10773/apdvncrp.htm

En Oracle 11G puede usar una notación con nombre como esta:

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

No creo que sea posible invocar estas funciones sin ambigüedades en versiones anteriores de Oracle, excepto creando una function de envoltura y llamándola en su lugar.

aquí hay una cripta / desencryption usando el antiguo 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; 

Y para descifrar:

 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; 

Y el uso:

 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;