使用PL / SQL生成16字节char类型唯一ID

时间:2014-04-17 07:53:21

标签: oracle aggregate-functions

我知道,SYS_GUID()返回一个16字节的RAW数据类型。但是当它转移到chars时,它将超过32字节的char类型。这与最大长度为char(16)的现有数据不兼容。那么是否可以使用Oracle聚合函数或语句生成一个16字节的char唯一ID?

1 个答案:

答案 0 :(得分:3)

不确定这种方法是否会导致碰撞(需要从理论的角度进行检验),但我认为碰撞的可能性仍然很低:

select utl_raw.bit_xor(utl_raw.substr(sys_guid(), 1, 8),
                       utl_raw.substr(sys_guid(), 9)) id
  from dual
connect by level <= 10;

另一种选择是使用最小值为SEQUENCE的{​​{1}}并将其强制转换为字符数据类型。

1000000000000000的主要目的是什么?您是否需要将其用作主键?

<强>更新 经过进一步考虑后,我建议坚持使用ID,因为它是本机PK生成机制。如果您需要超过SEQUENCE个唯一值(即1000000000000000到9999999999999999之间的数字),则可以使用十六进制表示。首先,让我们确定十六进制形式的16个字符的最小和最大数字(假设没有前导或尾随空格):

10^16 - 10^15 - 1

现在让我们使用确定的值创建select to_char(to_number('1000000000000000', 'XXXXXXXXXXXXXXXX')) min_value, to_char(to_number('FFFFFFFFFFFFFFFF', 'XXXXXXXXXXXXXXXX')) max_value from dual; MIN_VALUE MAX_VALUE -------------------------------------------- 1152921504606846976 18446744073709551615

SEQUENCE

要将主键转换序列号值生成为十六进制格式:

create sequence my_sequence 
 minvalue 1152921504606846976 
 maxvalue 18446744073709551615 
 start with 1152921504606846976
 increment by 1;