Oracle: как вызвать перегруженную процедуру? - PullRequest
3 голосов
/ 03 мая 2011

Как правильно позвонить 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 ]

9 голосов
/ 03 мая 2011

В Oracle 11G вы можете использовать именованную нотацию следующим образом:

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

Я не думаю, что в более ранних версиях Oracle можно однозначно вызывать эти функции, за исключением создания функции-оболочки и вызовачто вместо этого.

7 голосов
/ 03 мая 2011

здесь, просто дайте ему знать, какую перегрузку использовать, указав имена параметров!

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

возвращает

M5w5Z

обратите внимание, ваш ключ должен быть не менее 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

2 голосов
/ 03 мая 2011

Вот крипта / дешифрование с использованием более старого 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;
...