oracle guid

¿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?



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) ) /

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


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;