¿Es posible generar automáticamente un GUID en una instrucción Insert?
Además, ¿qué tipo de campo debo usar para almacenar este GUID?
Puede usar la función SYS_GUID () para generar un GUID en su declaració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 respuesta de 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 útil: http://feuerthoughts.blogspot.com/2006/02/watch-out-for-sequential-oracle-guids.html
También puede incluir el guid en la declaración de creación de la tabla como predeterminado, 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
fuente
No está claro qué quiere decir con generar automáticamente una guía en una declaración de inserción, pero supongo 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 la columna de ID debería declararse como RAW (16);
Estoy haciendo esto fuera de mi cabeza. No tengo una instancia de Oracle a la mano para probar, pero creo que eso es lo que quieres.
fuente
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:
fuente
sys_guid () es una mala opción, como han mencionado otras respuestas. Una forma de generar UUID y evitar valores secuenciales es generar cadenas hexadecimales aleatorias usted 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;
fuente
Puede ejecutar la siguiente consulta
select sys_guid() from dual union all select sys_guid() from dual union all select sys_guid() from dual
fuente
puede usar la función a continuación 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
fuente
Si necesita guías no secuenciales, puede enviar los
sys_guid()
resultados a través de una función hash (consulte https://stackoverflow.com/a/22534843/1462295 ). La idea es mantener la singularidad que se usa de la creación original y obtener algo con más bits mezclados.Por ejemplo:
Ejemplo que muestra la guía secuencial predeterminada frente a su envío a través de un hash:
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL UNION ALL SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL UNION ALL SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL UNION ALL SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL UNION ALL SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL UNION ALL SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL UNION ALL SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL UNION ALL SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
salida
fuente
Recomendaría usar la función "dbms_crypto.randombytes" de Oracle.
¿Por qué? Esta función devuelve un valor RAW que contiene una secuencia de bytes pseudoaleatoria criptográficamente segura, que se puede utilizar para generar material aleatorio para claves de cifrado.
select REGEXP_REPLACE(dbms_crypto.randombytes(16), '(.{8})(.{4})(.{4})(.{4})(.{12})', '\1-\2-\3-\4-\5') from dual;
No debe utilizar la función "sys_guid" si sólo cambia un carácter.
ALTER TABLE locations ADD (uid_col RAW(16)); UPDATE locations SET uid_col = SYS_GUID(); SELECT location_id, uid_col FROM locations ORDER BY location_id, uid_col; LOCATION_ID UID_COL ----------- ---------------------------------------------------------------- 1000 09F686761827CF8AE040578CB20B7491 1100 09F686761828CF8AE040578CB20B7491 1200 09F686761829CF8AE040578CB20B7491 1300 09F68676182ACF8AE040578CB20B7491 1400 09F68676182BCF8AE040578CB20B7491 1500 09F68676182CCF8AE040578CB20B7491
https://docs.oracle.com/database/121/SQLRF/functions202.htm#SQLRF06120
fuente