Oracle STANDARD_HASH在PLSQL中不可用?

时间:2016-02-23 10:13:21

标签: oracle hash plsql

我正在尝试在PL / SQL中使用STANDARD_HASH Oracle(12c)函数,但似乎不可用:

java -Dhudson.DNSMultiCast.disabled=true

/usr/bin/java -Dfile.encoding=UTF-8 -Dhudson.DNSMultiCast.disabled=true -jar /Applications/Jenkins/jenkins.war

从sql工作得很好:

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

为什么呢?在PLSQL中实现STANDARD_HASH的最佳方法是什么?

此致

3 个答案:

答案 0 :(得分:8)

似乎它还不是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>

我建议创建一个函数,并在 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> BEGIN
  2     dbms_output.put_line(STANDARD_HASH_OUTPUT('test'));
  3  END;
  4  /
A94A8FE5CCB19BA61C4C0873D391E987982FBBD3

PL/SQL procedure successfully completed.

SQL>

答案 1 :(得分:2)

对于文本, STANDARD_HASH 与带有SHA1的 DBMS_CRYPTO.HASH 相同:

begin
  dbms_output.put_line(dbms_crypto.hash(cast('test' as clob), dbms_crypto.hash_sh1));
end;
/

输出:

A94A8FE5CCB19BA61C4C0873D391E987982FBBD3

对于其他数据类型,没有记录它们如何传递给散列函数。

答案 2 :(得分:-1)

标准哈希允许您指定哈希算法。算法为SHA1,SHA256,SHA384,SHA512和MD5。如果省略此参数,则使用SHA1。

要获得比sys_guid更熟悉的GUID:

LOWER (CAST (standard_hash (SYS_GUID (), 'MD5') AS VARCHAR2 (40)))

我已经测试了2050万条记录,没有碰撞...