`
bigkylin
  • 浏览: 3032 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle中的SYS_GUID

阅读更多
Oracle8i引入了SYS_GUID这个概念,它同Oracle管理员所使用的传统的序列(sequence)相比具有诸多优势。一个序列生成器只是简单地创建从给定的起点开始的一系列整数值,而且它被用在选择陈述式的时候自动地递增该系列。
  
  序列生成器所生成的数字只能保证在单个实例里是唯一的,这就不适合将它用作并行或者远程环境里的主关键字,因为各自环境里的序列可能会生成相同的数字,从而导致冲突的发生。SYS_GUID会保证它创建的标识符在每个数据库 里都是唯一的。
  
  此外,序列必须是DML陈述式的一部分,因此它需要一个到数据库的往返过程(否则它就不能保证其值是唯一的)。SYS_GUID源自不需要对数据库进行访问的时间戳和机器标识符,这就节省了查询的消耗。
  
  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用作主关键字而不使用序列数感兴趣。这在对象在不同机器的不同数据库里生成以及需要在后来合并到一起的情况下很有用。
  
  但是,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
分享到:
评论

相关推荐

    OracleGoldenGate针对表没有主键或唯一索引的解决方案[归类].pdf

    需要在 Oracle GoldenGate 中配置表,以便使用 SYS_GUID 列来唯一标识行。 3. 参考文献 本文档中使用的软件组件: * Oracle Database 10.2 或更高版本 * Oracle GoldenGate 10.4 或更高版本 附录 A: 示例表配置 ...

    ORCALE语句大全

    - **进入界面**: 在CMD中输入`sqlplus scott/orcl@orcl`来启动Oracle的SQL Plus界面。 - **连接命令**: 使用`conn[ect] sys/orcl@orcl as sysdba`进行连接。 - **断开连接**: 输入`disc[onnect]`命令来断开当前的...

    ORACLE自增主键设置方法

    除了使用序列实现自增主键外,Oracle还提供了其他几种主键生成策略,比如使用`SYS_GUID()`函数生成全局唯一标识符(GUID)作为主键。这种方法适用于需要全局唯一性的场景,但可能不适合对性能要求较高的应用,因为`...

    利用ORACLE实现数据的抽样

    在Oracle中,可以通过使用`SYS_GUID()`或`DBMS_RANDOM`包来实现随机排序,从而达到随机抽样的目的。例如: ```sql SELECT * FROM (SELECT * FROM TB_PHONE_NO ORDER BY SYS_GUID()) WHERE ROWNUM ; ``` 此语句将从`...

    sql生成uuid

    与SQL Server不同,Oracle的`SYS_GUID()`直接返回一个格式化的UUID,无需额外的格式化步骤。以下是在Oracle中生成UUID的示例代码: ```sql SELECT SYS_GUID() FROM DUAL; ``` 这里,`DUAL`是一个特殊的单行表,常...

    oracle取随机数

    本文将深入探讨如何在Oracle中生成不同类型的随机数,包括字符型、数值型以及GUID,旨在为数据库管理员和开发人员提供全面的指导。 ### 一、随机数值型生成 #### 1. 使用`DBMS_RANDOM.RANDOM` 这是最基础的生成...

    6.2、oracle 相关sql1

    `SYS_GUID()`函数在Oracle中生成一个16字节的唯一值,通常用于创建具有唯一标识的记录。 然后,`SELECT LPAD(appseriono_sequence.NEXTVAL, 20, '0') FROM DUAL;` 和 `SELECT 'JF'||LPAD(contriapplyno_sequence....

    Oracle110个常用函数……PDF清晰版

    根据提供的文件标题、描述以及部分内文,我们可以推断出这份文档主要介绍的是Oracle数据库中的110个常用函数。由于提供的部分内容似乎并不是标准的文本格式,并且包含了一些乱码和不可读字符,这里将尝试根据给定的...

    Oracle维护常用SQL语句

    在Oracle中,随机抽取数据可以通过`SYS_GUID()`或`DBMS_RANDOM.VALUE`函数实现。以下是两种方法: 1. 使用`SYS_GUID()`函数: ```sql SELECT * FROM ( SELECT * FROM TABLENAME ORDER BY SYS_GUID() ) WHERE ...

    Oracle中树的操作

    V_ID := SYS_GUID(); LOOKUP(RECORDS(I).ID) := V_ID; -- 生成新ID并存入LOOKUP RECORDS(I).ID := V_ID; IF RECORDS(I).NAME <> 'ROOT' THEN RECORDS(I).PARENT_ID := LOOKUP(RECORDS(I).PARENT_ID); END IF; ...

    oracle笔记

    最后,提到了Oracle中的单行函数,如获取当前日期的SYSDATE,求余数的MOD,以及生成UUID的SYS_GUID()函数。 综上,Oracle数据库是一个强大且广泛使用的RDBMS,提供了多种数据操作和管理工具,对于数据存储、管理和...

    oracle数据行列转换

    在Oracle数据库中,数据的行列转换是数据处理过程中的常见操作,尤其在数据分析、报表制作以及数据展示时显得尤为重要。本篇文章将详细讲解Oracle 10g中的行列转换技术,包括如何实现行转列和列转行。 首先,我们要...

    Oracle笔记.pdf

    Oracle数据库还提供了丰富的内置函数,如单行函数sysdate获取当前时间,mod()计算模数,sys_guid()生成全局唯一标识符,length()计算字符串长度,to_char()和to_date()用于日期和字符串的转换,以及add_months()增加...

    oracle数据类型总结PPT

    例如,`sys_guid()`函数返回一个16字节的全局唯一标识符,它可以作为`RAW`数据存储。插入这样的数据可以帮助我们存储和检索不可见或无法直接解析的二进制信息。 总结起来,Oracle的数据类型设计允许开发者灵活地...

    sql总结以及linux部署

    通过使用`sys_guid()`函数来获取一个GUID,然后将其转换为十六进制字符串,并进行格式化处理,以符合标准UUID格式。 - **MySQL中的UUID生成函数**: ```sql select replace(uuid(), '-', ''); ``` MySQL提供了...

    大型数据库在java中的连接

    本文将深入探讨如何在Java环境中连接并操作Oracle数据库,包括创建表、序列以及触发器等核心概念。 #### 数据库连接配置 在Java中连接Oracle数据库,首先需要配置正确的数据库驱动类名和连接URL。例如: - **驱动...

    Oracle 12C CDB、PDB常用管理命令.docx

    Oracle 12C 中引入了 Container Database(CDB)和 Pluggable Database(PDB)的概念,CDB 是一个容器,PDB 是一个独立的数据库,可以与 CDB 共享资源。以下是 Oracle 12C CDB、PDB 的常用管理命令。 查看 PDB 信息...

    Linux中Oracle数据库备份

    在Linux环境中,Oracle数据库的管理和维护是至关重要的任务,其中包括备份和恢复操作。本文将详细介绍如何在不使用脚本的情况下,直接使用Linux命令行工具和Oracle数据库的SQL命令来完成Oracle数据库的备份与还原。 ...

Global site tag (gtag.js) - Google Analytics