我使用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
这是因为调用的函数在程序包中MD5
已重载DBMS_OBFUSCATION_TOOLKIT
,您需要指定要确切调用的函数。
在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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句