Oracle STANDARD_HASH not available in PLSQL?

PL / SQLでSTANDARD_HASHOracle(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でSTANDARD_HASHを実装するための最良の方法は何ですか?

よろしくオラクルハッシュplsql共有この質問を改善するフォローする2016年2月23日10:13に 尋ねたStefanG1601シルバーバッジ1個9ブロンズバッジ9個

  • 1すべてのSQL関数がPL / SQLで使用できるわけではありません。このリストにはありませんが、おそらくあるはずです。LNNVLと同じカテゴリに分類される可能性があります。 –  Alex Poole 2016年2月23日10:32
  • これは、ホイールの再発明であるカスタムラッパー関数の使用よりも正しい答えです。間違いなく、このバリアントは正解としてマークする必要があります。 – アレクサンダーゼメロフ2017年 6月23日14:29

コメントを追加

3つの答え

アクティブ最古投票15

のPL / SQLの一部ではないよう12cです。

回避策として、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>

共有この答えを改善するフォローする2016年2月25日11:18に編集2016年2月23日10:31に 回答ラリットクマールB42.5k1010個のゴールドバッジ7878個のシルバーバッジ110110個のブロンズバッジ

  • Lalitに感謝します!dbms_crypto.hash関数の方がはるかに遅い(avg.43%)ため、このメソッドを実装するようです。私はデュアル(個人的な意見)からの選択を避けたいと思いますが、この場合はこのソリューションを使用します。 –  stefanG 2016 年2月24日13:14

コメントを追加3

テキストの場合、STANDARD_HASHはSHA1のDBMS_CRYPTO.HASHと同じです。

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

出力:

A94A8FE5CCB19BA61C4C0873D391E987982FBBD3

他のデータ型については、それらがハッシュ関数にどのように渡されるかは文書化されていません。共有この答えを改善するフォローする2016年2月23日10:57に 回答Codo63.7k1616個のゴールドバッジ142142シルバーバッジ181181個のブロンズバッジ

  • Codoに感謝します!何らかの理由で、このメソッドは、STANDARD_HASH関数を使用してデュアルから選択するよりも遅くなります(clobへのキャストのため?)。びっくり! –  stefanG 2016 年2月24日13:19
  • それは確かに興味深いです。SELECTはコンテキストスイッチを伴うため、遅くなると予想していました。しかし、想定するよりも測定する方が常に良いです。更新していただきありがとうございます。 –  codo 2016 年2月24日13:37

コメントを追加-1

標準ハッシュを使用すると、ハッシュアルゴリズムを指定できます。アルゴリズムは、SHA1、SHA256、SHA384、SHA512、およびMD5です。この引数を省略すると、SHA1が使用されます。

sys_guidが提供するよりも使い慣れたGUIDを取得するには:

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

衝突のない2,050万件のレコードでテストしました…共有この答えを改善するフォローする20年8月30日22:07に 回答user141930991

  • もう1つの利点は、このメソッドがすべての組み込み関数を使用し、列DEFAULTに使用できることです。DEFAULT値ではユーザー定義の関数、プロシージャ、パッケージを使用できないため、組み込み関数を使用してSYS_GUIDをより視覚的に区別できる形式に変換する方法を探していました。 –  user141930 9920 年8月30日22:21

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA