Est-ce que SYS GUID() UUID RFC 4122 d'Oracle est conforme?

je me demande si la fonction SYS_GUID() d'Oracle retourne un UUID conforme à la RFC 4122. Par exemple:

SQL> select sys_guid() from dual;

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

je sais, que SYS_GUID() renvoie un type de données RAW de 16 octets. Oracle utilise RAWTOHEX() et probablement TO_CHAR() pour imprimer L'ID ci-dessus. Est-il correct d'interpréter ceci comme un format de chaîne compatible UUID comme:

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

je pense qu'il n'est pas conforme à la RFC 4122 standard, parce que la définition dit, que l'UUID doit le nom de l'UUID-Version dans L'UUID lui-même.

syntaxe for a RFC 4122 compliant UUID (Version 3):

xxxxxxxx-xxxx-3xxx-xxxx-xxxxxxxxxxxx
23
demandé sur APC 2011-06-28 15:39:53

3 réponses

SYS_GUID is Oracleéquivalent d'UUID. Il est unique au monde. Cependant, il n'est pas conforme à la RFC 4122; j'infère un manque de conformité de l'absence de références à UUID dans la documentation (en dehors de la documentation XML Java).

je soupçonne Oracle n'ont pas nativement mis en œuvre RFC 4122 parce qu'ils ne pensent pas qu'il échelles. Je ne vois pas pourquoi sinon ils inventeraient leur propre chose au lieu de se conformer à une norme.

19
répondu APC 2011-06-29 03:19:20

Si vous voulez que le format essayez ceci:

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})'
       , '----') 
         as FORMATTED_GUID 
 from dual

Exemple:

 FORMATTED_GUID                                                                  
 ------------------------------------
 F680233E-0FDD-00C4-E043-0A4059C654C9  
21
répondu scottrudy 2014-04-08 03:01:13

avec des privilèges suffisants, il est possible D'avoir Oracle générer des UUIDs conformes.

1. En définissant une fonction SQL

https://stackoverflow.com/a/13956771, vous pouvez effectuer les opérations suivantes:

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;

la fonction nécessite dbms_crypto et utl_raw. Tous deux nécessitent une subvention d'exécution.

grant execute on sys.dbms_crypto to uuid_user;

2. Utilisation D'une procédure Java

pour créer une procédure Java pour créer UUID conforme, voir https://stackoverflow.com/a/13951615.

1
répondu NealeU 2017-05-23 12:02:39