OracleのSYS_GUID()関数が RFC 4122準拠のUUID を返すかどうか疑問に思います。例えば:
SQL> select sys_guid() from dual;
SYS_GUID()
--------------------------------
A6C1BD5167C366C6E04400144FD25BA0
SYS_GUID()が16バイトのRAWデータ型を返すことは知っています。 Oracleは、RAWTOHEX()とおそらくTO_CHAR()を使用して、上記のIDを出力します。これを次のようなUUID準拠の文字列形式として解釈するのは正しいですか?
A6C1BD51-67C3-66C6-E044-00144FD25BA0
定義によれば、有効なUUIDはUUID自体の中でUUID-Versionに名前を付ける必要があるため、RFC4122標準に準拠していないと思います。
RFC 4122準拠のUUID(バージョン3)の構文:
xxxxxxxx-xxxx-3xxx-xxxx-xxxxxxxxxxxx
SYS_GUIDは、Oracleの同等のUUIDです。それは世界的にユニークです。ただし、RFC4122には準拠していません。ドキュメントにUUIDへの参照がないことからコンプライアンスの欠如を推測しています(Java XMLドキュメント以外)。
OracleはRFC4122が拡張可能であるとは考えていないため、ネイティブに実装していないのではないかと思います。なぜ彼らが基準に従わずに独自のものを発明するのか想像できません。
その形式が必要な場合は、これを試してください。
select regexp_replace(rawtohex(sys_guid())
, '([A-F0-9]{8})([A-F0-9]{4})([A-F0-9]{4})([A-F0-9]{4})([A-F0-9]{12})'
, '\1-\2-\3-\4-\5')
as FORMATTED_GUID
from dual
結果の例:
FORMATTED_GUID
------------------------------------
F680233E-0FDD-00C4-E043-0A4059C654C9
十分な権限があれば、Oracleに準拠したUUIDを生成させることができます。
1。 SQL関数を定義する
https://stackoverflow.com/a/13956771 から、次の操作を実行できます。
関数random_uuidの作成または置換returnRAW is v_uuid RAW(16); begin v_uuid:= sys.dbms_crypto.randombytes(16); return(utl_raw.overlay(utl_raw.bit_or(utl_raw.bit_and(utl_raw.substr(v_uuid、7、1)、 '0F')、 '40')、v_uuid、7)); endrandom_uuid ;
この関数には、dbms_crypto
とutl_raw
が必要です。どちらも実行許可が必要です。
grant execute on sys.dbms_crypto to uuid_user;
2。 Javaプロシージャの使用
準拠したUUIDを作成するためのJavaプロシージャを作成するには、 https://stackoverflow.com/a/13951615 を参照してください。