¿Es posible generar automáticamente un GUID en una instrucción Insert?¿Cómo generar un GUID en Oracle?
Además, ¿qué tipo de campo debo usar para almacenar este GUID?
¿Es posible generar automáticamente un GUID en una instrucción Insert?¿Cómo generar un GUID en Oracle?
Además, ¿qué tipo de campo debo usar para almacenar este GUID?
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
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.
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)
)
/
Gracias por alertarme sobre una útil función de Oracle que no conocía. – SteveT
puede ejecutar la siguiente consulta
select sys_guid() from dual
union all
select sys_guid() from dual
union all
select sys_guid() from dual
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;
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) –
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
extraño, el sys_guid() siempre me está dando el mismo GUID .. ¿es necesario dar una semilla para la función o? – Acibi
¿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! –
¡Oh, sí! Muchas gracias, los estaba leyendo demasiado rápido;) – Acibi