繁体   English   中英

PL / SQL过程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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM