![](/img/trans.png)
[英]How to HASH VARCHAR2 to Alphanumeric with DBMS_OBFUSCATION_TOOLKIT.MD5
[英]Aberrant function behavior of PL/SQL procedure DBMS_OBFUSCATION_TOOLKIT.MD5
我使用TOAD執行程序並運行PL / SQL腳本。
最近,我嘗試在PL / SQL中使用dbms_obfuscation_toolkit.md5()函數來檢索作為參數傳遞的字符串的加密文本。 我發現,當我將函數作為單獨的語句調用時,該函數會提供正確的結果。 但是,當我通過SELECT查詢調用它時,它不會響應相同的格式。
下面,我提到了這種特殊情況,並在TOAD應用程序中運行該結果后會顯示結果。
--CASE:1 (Proper result is obtained here)
DECLARE
vinput varchar2(255) := 'SRINI';
well varchar2(50);
BEGIN
WELL := DBMS_OBFUSCATION_TOOLKIT.MD5(input_string =>VINPUT);
dbms_output.put_line(well);
END;
輸出:Áýg¿Zq!Ù´¿Ke>ÏQ
--CASE:2 (Unexpected response is obtained here)
DECLARE
vinput varchar2(255) := 'SRINI';
well varchar2(50);
BEGIN
SELECT DBMS_OBFUSCATION_TOOLKIT.MD5(VINPUT)
INTO WELL
FROM DUAL;
dbms_output.put_line(well);
END;
錯誤輸出:ORA-06550:第5行,第37列:PLS-00307:太多的“ MD5”聲明與該調用匹配ORA-06550:第5行,第12列:PL / SQL:ORA-00904:“ DBMS_OBFUSCATION_TOOLKIT”。 MD5“:無效的標識符ORA-06550:第5行,第5列:PL / SQL:忽略了SQL語句
即使結果在語法和語義上都是正確的,為什么結果仍存在這種差異? 請提供您的意見和反饋。
您的函數調用在語法或語義上都不相同。 如果像在SQL中那樣在PL / SQL中調用該函數,則會得到相同的確切錯誤:
SQL> DECLARE
2 vinput VARCHAR2(255) := 'SRINI';
3 well VARCHAR2(50);
4 BEGIN
5 WELL := DBMS_OBFUSCATION_TOOLKIT.MD5(vinput);
6 dbms_output.put_line(well);
7 END;
8 /
ORA-06550: Ligne 5, colonne 12 :
PLS-00307: too many declarations of 'MD5' match this call
這是因為在包DBMS_OBFUSCATION_TOOLKIT
,名為MD5
的函數已重載 ,因此您需要指定要確切調用的函數。
在Oracle 11g中,可以使用與PL / SQL相同的synthax:
SQL> DECLARE
2 vinput VARCHAR2(255) := 'SRINI';
3 well VARCHAR2(50);
4 BEGIN
5 SELECT DBMS_OBFUSCATION_TOOLKIT.MD5(input_string => VINPUT)
6 INTO WELL FROM DUAL;
7 dbms_output.put_line(well);
8 END;
9 /
Áýg¿Zq!Ù´¿Ke>ÏQ
PL/SQL procedure successfully completed
在11g之前,您可以定義包裝函數:
SQL> CREATE OR REPLACE FUNCTION wrap_md5(input_string VARCHAR2)
2 RETURN dbms_obfuscation_toolkit.varchar2_checksum
3 IS
4 BEGIN
5 RETURN dbms_obfuscation_toolkit.md5(input_string => input_string);
6 END;
7 /
Function created
SQL> DECLARE
2 vinput VARCHAR2(255) := 'SRINI';
3 well VARCHAR2(50);
4 BEGIN
5 SELECT wrap_md5(VINPUT)
6 INTO WELL FROM DUAL;
7 dbms_output.put_line(well);
8 END;
9 /
Áýg¿Zq!Ù´¿Ke>ÏQ
PL/SQL procedure successfully completed
從雙中選擇dbms_obfuscation_toolkit.md5(input_string =>'SRINI'); 在select中使用此選項,以使此類函數使用輸入字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.