Перегрузка функций в Oracle PL/SQL

Статьи про Oracle -> Программирование

Перегрузка функций в Oracle PL/SQL

v:1.0 23.07.2010
Петрелевич Сергей

Хочу рассказать об интересной особенности перегрузки функций в Oracle PL/SQL.

Рассмотрим такой пример:

function GetChecksum(pKey in varchar2) return varchar2 is  vChecksum DBMS_OBFUSCATION_TOOLKIT.varchar2_checksum; begin  vChecksum:=DBMS_OBFUSCATION_TOOLKIT.MD5(pKey);  return vChecksum; end;
В примере вычисляется MD5 заданной строки, для этого используется функция пакеджа DBMS_OBFUSCATION_TOOLKIT, который входит в стандартную поставку Oracle PL/SQL.
При компиляции функции получим такую ошибку:
PLS-00307: too many declarations of 'MD5' match this call

Ошибка говорит о том, что в пакедже DBMS_OBFUSCATION_TOOLKIT несколько перегруженных функций MD5 и компилятор не может выбрать верную.
Смотрим пакедж DBMS_OBFUSCATION_TOOLKIT, видим:

 FUNCTION MD5(input IN RAW)RETURN raw_checksum;  FUNCTION MD5(input_string IN VARCHAR2)RETURN varchar2_checksum;

Компилятору надо дать какую-то подсказку, точно указать нужную функцию. Для этого есть интересный трюк.
При вызове функции надо указать наименование параметра функции, значение которого требуется установить.
Т.е. мой пример должен выглядеть так:

function GetChecksum(pKey in varchar2) return varchar2 is  vChecksum   DBMS_OBFUSCATION_TOOLKIT.varchar2_checksum; begin  vChecksum:=DBMS_OBFUSCATION_TOOLKIT.MD5(input_string=>pKey);  return vChecksum; end;
Обратите внимание на input_string=>pKey – вот это и позволяет компилятору определить, какую функцию надо вызвать.
После этого изменения пример работает как ожидается.

Метки: PL/SQL  

Комментарии.

Внимание.
Комментировать могут только зарегистрированные пользователи.
Возможно использование следующих HTML тегов: <a>, <b>, <i>, <br>.