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 的异常函数行为的主要内容,如果未能解决你的问题,请参考以下文章