Est-il possible de générer automatiquement un GUID dans une instruction Insert?
En outre, quel type de champ dois-je utiliser pour stocker ce GUID?
Vous pouvez utiliser la fonction SYS_GUID () pour générer un GUID dans votre instruction insert:
insert into mytable (guid_col, data) values (sys_guid(), 'xxx');
Le type de données préféré pour le stockage des GUID est RAW (16).
Comme Gopinath répond:
select sys_guid() from dual
union all
select sys_guid() from dual
union all
select sys_guid() from dual
Vous recevez
88FDC68C75DDF955E040449808B55601
88FDC68C75DEF955E040449808B55601
88FDC68C75DFF955E040449808B55601
Comme le dit Tony Andrews, diffère seulement d'un caractère}
88FDC68C75DD F955E040449808B55601
88FDC68C75DE F955E040449808B55601
88FDC68C75DF F955E040449808B55601
Peut-être utile: http://feuerthoughts.blogspot.com/2006/02/watch-out-for-sequential-Oracle-guids.html
Vous pouvez également inclure le guid dans l'instruction create de la table par défaut, par exemple:
create table t_sysguid
( id raw(16) default sys_guid() primary key
, filler varchar2(1000)
)
/
Il est difficile de comprendre ce que vous entendez par génération automatique d'un GUID dans une instruction Insert, mais je pense que vous essayez de faire quelque chose comme ce qui suit:
INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Adams');
INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Baker');
Dans ce cas, je pense que la colonne ID doit être déclarée RAW (16);
Je le fais par dessus la tête. Je n'ai pas d'instance Oracle sur laquelle tester, mais je pense que c'est ce que vous voulez.
sys_guid () est une mauvaise option, comme d'autres réponses l'ont mentionné. Une façon de générer des UUID et d’éviter les valeurs séquentielles consiste à générer vous-même des chaînes hexadécimales aléatoires:
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;
vous pouvez utiliser la fonction ci-dessous pour générer votre 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;
Exemple de GUID généré par la fonction ci-dessus:
8EA4-196D-BC48-9793-8AE8-5500-03DC-9D04
Vous pouvez exécuter la requête suivante
select sys_guid() from dual
union all
select sys_guid() from dual
union all
select sys_guid() from dual
Exemple trouvé sur: 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
Résultat:
6C7C9A50-3514-4E77-E053-B30210AC1082
Si vous avez besoin d'instructions non séquentielles, vous pouvez envoyer les résultats sys_guid()
par le biais d'une fonction de hachage (voir https://stackoverflow.com/a/22534843/1462295 ). L'idée est de conserver le caractère unique utilisé de la création originale et d'obtenir quelque chose avec des bits plus mélangés.
Par exemple:
LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32))
Exemple montrant un guide séquentiel par défaut ou l’envoi par hachage:
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
sortie
80c32a4fbe405707e0531e18980a1bbb
80c32a4fbe415707e0531e18980a1bbb
80c32a4fbe425707e0531e18980a1bbb
80c32a4fbe435707e0531e18980a1bbb
c0f2ff2d3ef7b422c302bd87a4588490
d1886a8f3b4c547c28b0805d70b384f3
a0c565f3008622dde3148cfce9353ba7
1c375f3311faab15dc6a7503ce08182c