¿Cómo generar un GUID en Oracle?
(7)
¿Es posible generar automáticamente un GUID en una instrucción Insert?
Además, ¿qué tipo de campo debo usar para almacenar este GUID?
Ejemplo encontrado en: http://www.orafaq.com/usenet/comp.databases.oracle.server/2006/12/20/0646.htm
SELECT REGEXP_REPLACE(SYS_GUID(), ''(.{8})(.{4})(.{4})(.{4})(.{12})'', ''/1-/2-/3-/4-/5'') MSSQL_GUID FROM DUAL
Resultado:
6C7C9A50-3514-4E77-E053-B30210AC1082
No está claro a qué te refieres con generar automáticamente un guid en una instrucción de inserción, pero supongo que intentas 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 la columna ID debe declararse como RAW (16);
Estoy haciendo esto fuera de mi cabeza. No tengo una instancia de Oracle útil para probar, pero creo que eso es lo que quieres.
Puede ejecutar la siguiente consulta
select sys_guid() from dual
union all
select sys_guid() from dual
union all
select sys_guid() from dual
Puede usar 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 almacenar GUID es RAW (16).
Como respondió Gopinath:
select sys_guid() from dual
union all
select sys_guid() from dual
union all
select sys_guid() from dual
Usted obtiene
88FDC68C75DDF955E040449808B55601
88FDC68C75DEF955E040449808B55601
88FDC68C75DFF955E040449808B55601
Como dice Tony Andrews, difiere solo en un personaje
88FDC68C75D D F955E040449808B55601
88FDC68C75D E F955E040449808B55601
88FDC68C75D F F955E040449808B55601
Quizás sea útil: http://feuerthoughts.blogspot.com/2006/02/watch-out-for-sequential-oracle-guids.html
También puede incluir el guid en la instrucción create de la tabla como predeterminado, por ejemplo:
create table t_sysguid
( id raw(16) default sys_guid() primary key
, filler varchar2(1000)
)
/
puede usar la función siguiente para 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 := ''0123456789'' || ''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 generado por la función anterior:
8EA4-196D-BC48-9793-8AE8-5500-03DC-9D04
sys_guid () es una opción pobre, como han mencionado otras respuestas. Una forma de generar UUID y evitar valores secuenciales es generar cadenas de caracteres hexagonales al azar:
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;