2010-06-14 59 views

Respuesta

107

Puede utilizar la función SYS_GUID() para generar un GUID en su instrucción de inserción:

insert into mytable (guid_col, data) values (sys_guid(), 'xxx'); 

El tipo de datos preferido para los GUID de almacenamiento es RAW (16).

Como Gopinath respuesta:

select sys_guid() from dual 
union all 
select sys_guid() from dual 
union all 
select sys_guid() from dual 

Se obtiene

88FDC68C75DDF955E040449808B55601
88FDC68C75DEF955E040449808B55601
88FDC68C75DFF955E040449808B55601

Como dice Tony Andrews, difiere sólo en un personaje

88FDC68C75D D F955E040449808B55601
88FDC68C75D E F955E040449808B55601
88FDC68C75D F F955E040449808B55601

Quizás útil: http://feuerthoughts.blogspot.com/2006/02/watch-out-for-sequential-oracle-guids.html

+0

extraño, el sys_guid() siempre me está dando el mismo GUID .. ¿es necesario dar una semilla para la función o? – Acibi

+10

¿Estás seguro de que son exactamente iguales? Tiende a devolver valores muy similares (pero diferentes), p. cuando lo intenté obtuve 88FDC68C75DEF955E040449808B55601 y 88FDC68C75DFF955E040449808B55601, ¡que difieren solo en el 12 ° carácter! –

+2

¡Oh, sí! Muchas gracias, los estaba leyendo demasiado rápido;) – Acibi

7

No está claro a qué se refiere por auto-generar un GUID en una instrucción de inserción, pero a ojo, creo que está tratando de hacer algo como lo siguiente:

INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Adams'); 
INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Baker'); 

En ese caso, creo que el ID la columna debe declararse como RAW (16);

Lo estoy haciendo de la parte superior de mi cabeza. No tengo una instancia de Oracle útil para probar, pero creo que eso es lo que quieres.

23

También puede incluir el GUID en la sentencia de creación de la tabla por defecto, por ejemplo:

create table t_sysguid 
(id  raw(16) default sys_guid() primary key 
, filler varchar2(1000) 
) 
/

Ver aquí: http://rwijk.blogspot.com/2009/12/sysguid.html

+0

Gracias por alertarme sobre una útil función de Oracle que no conocía. – SteveT

2

puede ejecutar la siguiente consulta

select sys_guid() from dual 
union all 
select sys_guid() from dual 
union all 
select sys_guid() from dual 
2

sys_guid() es una opción pobre, como han mencionado otras respuestas.Una forma de generar UUID y evitar valores secuenciales es generar cadenas hexadecimales aleatorios mismo:

select regexp_replace(
    to_char(
     DBMS_RANDOM.value(0, power(2, 128)-1), 
     'FM0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'), 
    '([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') from DUAL; 
+1

No se garantiza que sean únicos. Debería emparejarlo con algo así como una restricción única en el lugar donde lo esté almacenando, si lo está almacenando. (y generar un nuevo número si encuentra un valor repetido y viola la restricción única, por improbable que pueda ser) –

0

puede utilizar abajo función con el fin de generar su UUID

create or replace FUNCTION RANDOM_GUID 
    RETURN VARCHAR2 IS 

    RNG NUMBER; 
    N  BINARY_INTEGER; 
    CCS VARCHAR2 (128); 
    XSTR VARCHAR2 (4000) := NULL; 
    BEGIN 
    CCS := '' || 'ABCDEF'; 
    RNG := 15; 

    FOR I IN 1 .. 32 LOOP 
     N := TRUNC (RNG * DBMS_RANDOM.VALUE) + 1; 
     XSTR := XSTR || SUBSTR (CCS, N, 1); 
    END LOOP; 

    RETURN SUBSTR(XSTR, 1, 4) || '-' || 
     SUBSTR(XSTR, 5, 4)  || '-' || 
     SUBSTR(XSTR, 9, 4)  || '-' || 
     SUBSTR(XSTR, 13,4)  || '-' || 
     SUBSTR(XSTR, 17,4)  || '-' || 
     SUBSTR(XSTR, 21,4)  || '-' || 
     SUBSTR(XSTR, 24,4)  || '-' || 
     SUBSTR(XSTR, 28,4); 
END RANDOM_GUID; 

Ejemplo de GUID genedrated por la función anterior :
8EA4-196D-BC48-9793-8AE8-5500-03DC-9D04