web-dev-qa-db-fra.com

Comment générer un GUID dans Oracle?

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?

74
Acibi

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

121
Tony Andrews

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

Voir ici: http://rwijk.blogspot.com/2009/12/sysguid.html

26
TTT

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.

7
Kenneth Baltrinic

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;
3
MikeWyatt

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

2

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
2
Gopinath Kotla

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 
1
Zartch

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
0
BurnsBA