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つの答え
の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
テキストの場合、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