2014-02-21 22 views
1

我使用TOAD來執行我的過程並運行我的PL/SQL腳本。PL/SQL過程的異常函數行爲DBMS_OBFUSCATION_TOOLKIT.MD5

最近,我試着在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> IQ

--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語句ig nored

爲什麼結果中存在這樣的差異,儘管它們在語法和語義上都是正確的?請提供您的意見和反饋。

+0

Err ...您的第二個示例不正確,可以從錯誤消息得出結論。 – user272735

+0

抱歉這麼寫,仍然在這裏學習曲線。 – srajappa

回答

2

您的函數調用在語法和語義上都不相同。如果你調用在PL/SQL的功能,當你在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 

這是因爲所謂的MD5的功能是在包DBMS_OBFUSCATION_TOOLKIToverloaded,你需要指定哪些功能準確地打電話。

在Oracle 11g中,你可以使用相同的synthax爲PL/SQL:

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 

11克之前,你可以定義一個包裝函數:

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 
+0

謝謝@馬爾格拉特,你的確清除了我的懷疑。 – srajappa

0

選擇dbms_obfuscation_toolkit.md5(input_string = >'SRINI')從雙重;在選擇這種類型的函數時使用這個輸入字符串。