Oracle标准\u哈希在PLSQL中不可用?
我试图在PL/SQL中使用标准的_散列Oracle(12c)函数,但似乎不可用:Oracle标准\u哈希在PLSQL中不可用?,oracle,hash,plsql,Oracle,Hash,Plsql,我试图在PL/SQL中使用标准的_散列Oracle(12c)函数,但似乎不可用: SQL> exec dbms_output.put_line(STANDARD_HASH('test')); BEGIN dbms_output.put_line(STANDARD_HASH('test')); END; * ERROR at line 1: ORA-06550: line 1, column 28: PLS-00201: ident
SQL> exec dbms_output.put_line(STANDARD_HASH('test'));
BEGIN dbms_output.put_line(STANDARD_HASH('test')); END;
*
ERROR at line 1:
ORA-06550: line 1, column 28:
PLS-00201: identifier 'STANDARD_HASH' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
“从sql开始”工作正常:
SQL> select STANDARD_HASH('test') from dual;
STANDARD_HASH('TEST')
----------------------------------------
A94A8FE5CCB19BA61C4C0873D391E987982FBBD3
为什么??在PLSQL中实现标准_散列的最佳方法是什么
在
12c
中,它似乎还不是PL/SQL的一部分
作为一种解决方法,请在PL/SQL中使用SELECT-INTO
:
SQL> set serveroutput on
SQL> DECLARE
2 str VARCHAR2(40);
3 BEGIN
4 SELECT STANDARD_HASH('test') INTO str FROM dual;
5 dbms_output.put_line(str);
6 END;
7 /
A94A8FE5CCB19BA61C4C0873D391E987982FBBD3
PL/SQL procedure successfully completed.
SQL>
SQL> BEGIN
2 dbms_output.put_line(STANDARD_HASH_OUTPUT('test'));
3 END;
4 /
A94A8FE5CCB19BA61C4C0873D391E987982FBBD3
PL/SQL procedure successfully completed.
SQL>
我建议创建一个函数,并在PL/SQL中随时使用它
比如说,
SQL> CREATE OR REPLACE FUNCTION STANDARD_HASH_OUTPUT(str IN VARCHAR2)
2 RETURN VARCHAR2
3 AS
4 op VARCHAR2(40);
5 BEGIN
6 SELECT STANDARD_HASH(str) INTO op FROM dual;
7 RETURN op;
8 END;
9 /
Function created.
直接在PL/SQL块中调用函数:
SQL> set serveroutput on
SQL> DECLARE
2 str VARCHAR2(40);
3 BEGIN
4 SELECT STANDARD_HASH('test') INTO str FROM dual;
5 dbms_output.put_line(str);
6 END;
7 /
A94A8FE5CCB19BA61C4C0873D391E987982FBBD3
PL/SQL procedure successfully completed.
SQL>
SQL> BEGIN
2 dbms_output.put_line(STANDARD_HASH_OUTPUT('test'));
3 END;
4 /
A94A8FE5CCB19BA61C4C0873D391E987982FBBD3
PL/SQL procedure successfully completed.
SQL>
对于文本,标准_散列与DBMS_CRYPTO.HASH相同,带有SHA1:
begin
dbms_output.put_line(dbms_crypto.hash(cast('test' as clob), dbms_crypto.hash_sh1));
end;
/
输出:
A94A8FE5CCB19BA61C4C0873D391E987982FBBD3
对于其他数据类型,没有记录它们是如何传递给哈希函数的。标准哈希允许您指定哈希算法。算法有SHA1、SH256、SH384、SH512和MD5。如果省略此参数,则使用SHA1 要获得比sys\u GUID提供的更熟悉的GUID,请执行以下操作:
LOWER (CAST (standard_hash (SYS_GUID (), 'MD5') AS VARCHAR2 (40)))
我在2050万条记录上进行了测试,没有冲突…不是所有的SQL函数都可以在PL/SQL中使用;事实并非如此,但或许应该如此。可能与LNNVL属于同一类。这是比使用自定义包装器功能更正确的答案,自定义包装器功能是轮子的再发明。当然,此变体必须标记为正确答案。谢谢Lalit!似乎我将实现这个方法,因为dbms_crypto.hash函数似乎要慢得多(平均43%)。我更喜欢避免双重选择(个人观点),但在这种情况下,我会选择这个解决方案。谢谢Codo!由于某种原因,这种方法比使用标准的_散列函数的select-from-dual慢(因为转换为clob?)。我很惊讶!那确实很有趣。我本以为SELECT会慢一些,因为它涉及到上下文切换。但衡量总是比假设好。感谢您的更新。另一个好处是此方法使用所有内置函数,并且可以用于列默认值。因为不能在默认值中使用用户定义的函数、过程和包,所以我一直在寻找一种方法来坚持使用内置函数,以便将SYS\u GUID变形为更直观的格式。