create table use_seq_table(id integer); create sequence use_seq_sequence; insert into use_seq_table values (use_seq_sequence_value.nextval); REM - for some reason, the documentation uses raw(32) create table use_guid_table(id raw(16)); insert into use_guid_table(sys_guid());
但是,SYS_GUID所生成的值是一个16位的原始值。序列所生成的整数不会使用16位(的值),除非它达到了10的30次方(每个字节有两位),而且数字是相当独特的:
SQL> select dump(123456789012345678901234567890) from dual; DUMP(123456789012345678901234567890) -------------------------------------------------------------- Typ=2 Len=16: 207,13,35,57,79,91,13,35,57,79,91,13,35,57,79,91
较短的值就意味着用于表格和索引的存储空间更少,以及查询访问的时间更短。
使用SYS_GUID或者序列会在数据库使用周期里的某些地方造成性能上的消耗;问题就是在哪里。对于SYS_GUID而言,性能上的影响在查询时间和创建时间上(在表格里要创建更多的块和索引以容纳数据)。对序列而言,性能上的影响在查询期间,在这个时候,SGA序列的缓冲区被用光。在缺省情况下,一个序列一次会缓冲20个值。如果数据库没有使用这些值就关闭了,它们就会被丢失。
SYS_GUID生成的值的另一个显著的不足之处是,管理这些值会变得困难得多。你必须(手动)输入它们或者通过脚本来填充它们,或者将它们作为Web参数来传递。
出于这些原因,将SYS_GUID作为一个主关键字不是一个很好主意,除非是在一个并行的环境里或者希望避免使用管理序列生成器的情况下。
在这里,我们不讨论 guid和序列器的优势,每个都会有特定环境下的需求。在Oracle9i和Oracle 10g 里SYS_GUID产生得到的数据是32 位的,如:234E45F0077881AAE0430AA3034681AA
我这里要做的功能是将guid分割成为 Windows系统 ObjectId 的格式:{8-4-4-4-12} ,下面给出两种解决方法:
方法一:利用substr进行分割,非常简单,具体代码如下:
/** * 创建系统Object Id 格式的字符串,返回的结果如下:{234E45F0-077A-81AA-E043-0AA3034681AA} */ function CreateGUID return varchar2 is guid varchar(64); begin guid := SYS_GUID(); return '{'||substr(guid,1,8)||'-'||substr(guid,9,4)|| '-'||substr(guid,13,4)||'-'||substr(guid,17,4) ||'-'||substr(guid,21,12)||'}'; end CreateGUID;
CREATE OR REPLACE FUNCTION GET_GUID RETURN CHAR IS v_guid CHAR (36); v_guid_part_one CHAR (8); v_guid_part_two CHAR (4); v_guid_part_three CHAR (4); v_guid_part_four CHAR (4); v_guid_part_five CHAR (12); BEGIN SELECT SYS_GUID () INTO v_guid FROM DUAL; v_guid_part_one := SUBSTR (v_guid, 0, 8); v_guid_part_two := SUBSTR (v_guid, 8, 4); v_guid_part_three := SUBSTR (v_guid, 12, 4); v_guid_part_four := SUBSTR (v_guid, 16, 4); v_guid_part_five := SUBSTR (v_guid, 20, 12); v_guid := CONCAT (CONCAT (CONCAT (CONCAT (CONCAT (CONCAT (CONCAT (CONCAT (v_guid_part_one, '-'), v_guid_part_two ), '-' ), v_guid_part_three ), '-' ), v_guid_part_four ), '-' ), v_guid_part_five ); RETURN (v_guid); END GET_GUID;
转载自:http://www.cnblogs.com/dongqi/archive/2008/10/13/1310185.html