PL/SQL 过程 DBMS_OBFUSCATION_TOOLKIT.MD5 的异常函数行为

Posted

技术标签:

【中文标题】PL/SQL 过程 DBMS_OBFUSCATION_TOOLKIT.MD5 的异常函数行为【英文标题】:Aberrant function behavior of PL/SQL procedure DBMS_OBFUSCATION_TOOLKIT.MD5 【发布时间】:2014-02-21 09:51:35 【问题描述】:

我使用 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 语句

即使它们在句法和语义上都是正确的,为什么结果会有如此大的差异?请提供您的意见和反馈。

【问题讨论】:

Err ...您的第二个示例不正确,可以从错误消息中得出结论。 很抱歉这样写,这里还在学习曲线上。 【参考方案1】:

您的函数调用在语法和语义上都不相同。如果像在 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

这是因为调用MD5的函数是overloaded在包DBMS_OBFUSCATION_TOOLKIT中,你需要指定具体调用哪个函数。

在 Oracle 11g 中,您可以使用与 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

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

【讨论】:

谢谢@vincent Malgrat,你确实解决了我的疑问。【参考方案2】:

选择 dbms_obfuscation_toolkit.md5(input_string => 'SRINI') from dual;在 select 中使用 this 类型的函数使用输入字符串。

【讨论】:

以上是关于PL/SQL 过程 DBMS_OBFUSCATION_TOOLKIT.MD5 的异常函数行为的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 过程和 Toad 执行?

Oracle Database-PL/SQL

ORACLE PL/SQL:以最大执行时间调用外部 Oracle PL/SQL 过程

pl/sql编程基础

PL-SQL 存储函数和存储过程

Oracle数据库技术之PL/SQL语法和存储过程