web-dev-qa-db-ja.com

OracleのSYS_GUID()UUID RFC 4122に準拠していますか?

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
25
nulldevice

SYS_GUIDは、Oracleの同等のUUIDです。それは世界的にユニークです。ただし、RFC4122には準拠していません。ドキュメントにUUIDへの参照がないことからコンプライアンスの欠如を推測しています(Java XMLドキュメント以外)。

OracleはRFC4122が拡張可能であるとは考えていないため、ネイティブに実装していないのではないかと思います。なぜ彼らが基準に従わずに独自のものを発明するのか想像できません。

19
APC

その形式が必要な場合は、これを試してください。

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  
23
scottrudy

十分な権限があれば、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_cryptoutl_rawが必要です。どちらも実行許可が必要です。

grant execute on sys.dbms_crypto to uuid_user;

2。 Javaプロシージャの使用

準拠したUUIDを作成するためのJavaプロシージャを作成するには、 https://stackoverflow.com/a/13951615 を参照してください。

2
NealeU