2010-06-14 38 views

回答

107

可以使用SYS_GUID()函数在你插入语句生成一个GUID:

insert into mytable (guid_col, data) values (sys_guid(), 'xxx'); 

的首选数据类型存储的GUID是RAW(16)。

由于纳思答案:

select sys_guid() from dual 
union all 
select sys_guid() from dual 
union all 
select sys_guid() from dual 

你得到

88FDC68C75DDF955E040449808B55601
88FDC68C75DEF955E040449808B55601
88FDC68C75DFF955E040449808B55601

正如托尼·安德鲁斯说,仅在一个字符的不同

88FDC68C75D d F955E040449808B55601
88FDC68C75D Ë F955E040449808B55601
88FDC68C75D ˚F F955E040449808B55601

也许有用:http://feuerthoughts.blogspot.com/2006/02/watch-out-for-sequential-oracle-guids.html

+0

怪异的SYS_GUID()总是给我同样的GUID ..我是否需要得到种子的功能或? – Acibi 2010-06-14 13:45:43

+10

你确定它们完全一样吗?它倾向于返回非常相似(但不同)的值 - 例如当我刚刚尝试时,我得到了88FDC68C75DEF955E040449808B55601和88FDC68C75DFF955E040449808B55601,它们只有第12个字符才有区别! – 2010-06-14 13:54:46

+2

哦,是啊! 非常感谢,我读得太快;) – Acibi 2010-06-14 14:08:50

7

目前尚不清楚你的意思是通过自动生成一个GUID到一个INSERT语句,但在猜测,我认为你正在试图做类似如下:

INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Adams'); 
INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Baker'); 

在这种情况下,我相信ID列应该声明为RAW(16);

我正在做我的头顶。我没有一个方便测试的Oracle实例,但我认为这就是你想要的。

23

还可以包括一个GUID的表作为默认的创建语句,例如:

create table t_sysguid 
(id  raw(16) default sys_guid() primary key 
, filler varchar2(1000) 
) 
/

在这里看到:http://rwijk.blogspot.com/2009/12/sysguid.html

+0

感谢您提醒我注意一个我不知道的有用Oracle特性。 – SteveT 2012-05-07 14:21:51

2

您可以运行下面的查询

select sys_guid() from dual 
union all 
select sys_guid() from dual 
union all 
select sys_guid() from dual 
2

sys_guid()是一个糟糕的选项,因为其他答案已经提到。生成的UUID,避免连续值的一种方法是随机生成的十六进制字符串自己:

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; 
+1

这些不保证是唯一的。如果要存储它,则需要将它与某个特定约束条件(无论您存储在何处)进行配对。 (如果遇到重复值并违反唯一约束条件,则会生成新的数字,但不太可能) – 2018-01-05 01:09:25

0

您可以使用函数波纹管,以生成你的UUID GUID的

create or replace FUNCTION RANDOM_GUID 
    RETURN VARCHAR2 IS 

    RNG NUMBER; 
    N  BINARY_INTEGER; 
    CCS VARCHAR2 (128); 
    XSTR VARCHAR2 (4000) := NULL; 
    BEGIN 
    CCS := '' || '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; 

例通过以上功能genedrated :
8EA4-196D-BC48-9793-8AE8-5500-03DC-9D04