Oracle标准\u哈希在PLSQL中不可用?

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

我试图在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: 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变形为更直观的格式。