29

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

RFC 4122 標準に準拠していないと思います。有効な UUID は、UUID 自体の中で UUID-Version に名前を付ける必要があると定義されているためです。

RFC 4122 準拠の UUID (バージョン 3) の構文:

xxxxxxxx-xxxx-3xxx-xxxx-xxxxxxxxxxxx
4

4 に答える 4

26

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

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  
于 2012-06-05T14:35:23.177 に答える
23

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

オラクルは RFC 4122 をネイティブに実装していないのではないかと思います。標準に準拠する代わりに、彼らが独自のものを発明する理由が他にあるとは想像できません。

于 2011-06-29T03:19:20.360 に答える
3

十分な権限があれば、Oracle に準拠した UUID を生成させることができます。

1. SQL 関数を定義する

https://stackoverflow.com/a/13956771から、次のことができます。

create or replace function random_uuid return RAW は
  v_uuid RAW(16);
始める
  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));
random_uuid を終了します。

関数にはdbms_cryptoとが必要utl_rawです。どちらも実行権限が必要です。

grant execute on sys.dbms_crypto to uuid_user;

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

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

于 2016-02-08T16:40:34.617 に答える