首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PL/SQL过程DBMS_OBFUSCATION_TOOLKIT.MD5的异常函数行为

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

Stack Overflow用户
提问于 2014-02-21 09:51:35
回答 2查看 747关注 0票数 1

我使用蟾蜍来执行我的过程和运行我的PL/SQL脚本。

最近,我尝试使用PL/SQL中的dbms_obfuscation_toolkit.md5()函数来检索作为参数传递的字符串的加密文本。我发现,当我将函数作为单独的语句调用时,该函数给出了正确的结果。但是,当我通过SELECT查询调用它时,它不会响应相同的格式。

下面,我已经提到了这个特殊的案例,以及我在蟾蜍应用程序中运行它时所出现的结果。

代码语言:javascript
复制
--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

代码语言:javascript
复制
--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语句忽略了

为什么结果有这么大的差异,尽管两者在语法和语义上都是正确的?请提供您的意见和反馈。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-21 10:00:43

您的函数调用在语法上和语义上都不相同。如果您像在SQL中一样调用PL/SQL中的函数,您将得到相同的错误:

代码语言:javascript
复制
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_TOOLKIT中的过载,您需要指定确切地调用哪个函数。

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

代码语言:javascript
复制
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之前,您可以定义一个包装函数:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2014-02-21 10:08:13

从dual中选择dbms_obfuscation_toolkit.md5(input_string => 'SRINI');在select中使用这一点,因为这样的函数类型使用输入字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21930831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档