Соответствует ли Oracle SYS_GUID () UUID RFC 4122? - PullRequest
24 голосов
/ 28 июня 2011

Интересно, возвращает ли функция Oracle SYS_GUID () UUID, соответствующий RFC 4122 . Например:

SQL> select sys_guid() from dual;

SYS_GUID()
--------------------------------
A6C1BD5167C366C6E04400144FD25BA0

Я знаю, что SYS_GUID () возвращает 16-байтовый тип данных RAW. Oracle использует RAWTOHEX () и, вероятно, TO_CHAR (), чтобы распечатать вышеуказанный идентификатор. Правильно ли интерпретировать это как UUID-совместимый формат строки, такой как:

A6C1BD51-67C3-66C6-E044-00144FD25BA0

Я думаю, что он не соответствует стандарту RFC 4122, поскольку в определении говорится, что действительный UUID должен называть UUID-версию в самом UUID.

Синтаксис для UUID, совместимого с RFC 4122 (Версия 3):

xxxxxxxx-xxxx-3xxx-xxxx-xxxxxxxxxxxx

Ответы [ 3 ]

22 голосов
/ 05 июня 2012

Если вы хотите этот формат, попробуйте это:

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  
19 голосов
/ 29 июня 2011

SYS_GUID - это эквивалент Oracle UUID. Это глобально уникально. Однако это не соответствует RFC 4122; Я предполагаю несоответствие из-за отсутствия ссылок на UUID в документации (за пределами документации Java XML).

Я подозреваю, что Oracle не имеет встроенного RFC 4122, потому что не считает, что он масштабируется. Я не могу себе представить, почему еще они изобрели бы свою собственную вещь вместо того, чтобы соответствовать стандарту.

2 голосов
/ 08 февраля 2016

При наличии достаточных привилегий возможно, чтобы Oracle генерировал соответствующие UUID.

1. Определяя функцию SQL

С https://stackoverflow.com/a/13956771, вы можете сделать следующее:

create or replace function random_uuid return RAW 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));
end random_uuid;

Функция требует dbms_crypto и utl_raw. Оба требуют гранта на исполнение.

grant execute on sys.dbms_crypto to uuid_user;

2. Использование процедуры Java

Чтобы создать процедуру Java для создания совместимого UUID, см. https://stackoverflow.com/a/13951615.

...