¿SYS_GUID() UUID RFC 4122 de Oracle es compatible?
(3)
Con suficientes privilegios, es posible que Oracle genere UUID compatibles.
1. Al definir una función SQL
Desde https://stackoverflow.com/a/13956771 , puede hacer lo siguiente:
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 función requiere dbms_crypto
y utl_raw
. Ambos requieren una concesión de ejecución.
grant execute on sys.dbms_crypto to uuid_user;
2. Usando un procedimiento de Java
Para crear un procedimiento de Java para crear un UUID compatible, consulte https://stackoverflow.com/a/13951615 .
Me pregunto si la función SYS_GUID () de Oracle devuelve un UUID compatible con RFC 4122 . Por ejemplo:
SQL> select sys_guid() from dual;
SYS_GUID()
--------------------------------
A6C1BD5167C366C6E04400144FD25BA0
Lo sé, que SYS_GUID () devuelve un tipo de datos RAW de 16 bytes. Oracle usa RAWTOHEX () y probablemente TO_CHAR () para imprimir el ID anterior. ¿Es correcto interpretar esto como un formato de cadena compatible con UUID como:
A6C1BD51-67C3-66C6-E044-00144FD25BA0
Creo que no es compatible con el estándar RFC 4122, porque la definición dice que un UUID válido debe nombrar la versión de UUID dentro del mismo UUID.
Sintaxis para un UUID compatible con RFC 4122 (Versión 3):
xxxxxxxx-xxxx-3xxx-xxxx-xxxxxxxxxxxx
SYS_GUID es el equivalente de UUID de Oracle. Es globalmente único. Sin embargo, no es compatible con RFC 4122; Estoy deduciendo la falta de cumplimiento de la ausencia de referencias a UUID en la documentación (fuera de la documentación de Java XML).
Sospecho que Oracle no ha implementado RFC 4122 de forma nativa porque no creen que se amplíe. No puedo imaginar por qué, de lo contrario, inventarán sus propias cosas en lugar de cumplir una norma.
Si quieres ese formato prueba esto:
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
Resultados de ejemplo:
FORMATTED_GUID
------------------------------------
F680233E-0FDD-00C4-E043-0A4059C654C9