zoukankan      html  css  js  c++  java
  • 转Oracle数据类型及存储方式【F】

    第五部分 LONG类型
    LONG是一种已经被弃用的数据类型,LOB类型是它的替代品.所以留在LOB之后进行讨论.
    我们只需要简单的了解即可.为什么ORACLE还保留这种类型,只是为了向后兼容,在新的数据库设计是,不要再使用LONG类型列.
    LONG类型有两种:
       LONG :能存储2GB的字符
       LONG RAW:能存储最多2GB的二进制数据.

    我们只需要对LONG类型的限制进行了解即可.


    LONG/LONG RAW 类型 CLOB/BLOB类型
    一个表只能有一个LONG/LONG RAW列 一个表可以有最多1000个LOB类型列
    不能用于用户自定义类型 可以用于用户自定义类型
    WHERE中不能引用LONG类型 可以
    除了NOT NULL,完整性约束中不能引用 可以
    不支持分布式事务 支持
    不能使用基本或高级复制技术 可以
    不能在GROUP BY,ORDER BY,CONNECT BY,DISTINCT,UNIQUE,INTERSECT,MINUS,UNION中使用 可以通过函数来转换成一个标量SQL类型来支持
    PL/SQL函数和过程中不能作为参数 可以
    不能应用于内置函数,如SUBSTR 可以
    CREATE TABLE AS SELECT不能使用LONG类型 支持
    在有LONG类型的表中不能进行移动表空间 可以
    总之一句话,新系统不应该再使用LONG类型.
    老系统如果有的表的某些字段是LONG类型,要注意它的限制

    第六部分 ROWID
    ROWID 就是数据库中一行的地址,用于记录数据存储的一些属性,包括:记录存储所在的数据文件(file#),所属的数据库对象(obj#),所在的数据块号(block_no#),以及在表中的行号。这些属性就构成了Oracle 的ROWID.
    我们需要注意的是在数据表中并没有一列来专门记录ROWID。
    另外还有一个UROWID,它用于表,是行主键的一个表示,基于主键生成.一般是索引组织表在使用。索引组织表是没有ROWID的。
    不管是ROWID还是UROWID,数据表都没有专门的一列来记录。
    我们把这两种类型称为伪列。
    SQL> create table test_rowid (id number(38));

    Table created

    SQL> insert into test_rowid values(1);

    1 row inserted
    SQL> select rowid, id from test_rowid;

    ROWID                                                   ID
    ------------------ ---------------------------------------
    AAAKsAAAEAAAAC+AAA                                       1

    因为ROWID可以唯一的标识一条记录,所以索引中存储了ROWID值,通过索引访问记录,其实也就是通过从索引获得ROWID,再根据ROWID定位数据表中的记录。
    但是当对表进行分区移动之后,索引就需要重建,因为存储位置已经发生了变化,索引中的ROWID已经不能再定位到新的数据了。
    ORACLE 的ROWID一直在不断变化。
    在ORACLE 6中,ROWID使用6bit来表示文件号。
    在ORACLE 8,ROWID的组成是FFFF.BBBBBBBB.RRRR。占用6个字节。
    10bit 的file#,22bit的block#,16bit的row #
    在ORACLE 9中,Oracle 为ROWID引入了数据对象号的概念dataobj#.
    现在ROWID格式变为OOOOOO.FFF.BBBBBB.RRR。最新的ROWID采用Base64编码,一共有18位,代表80位二进制数,其中:O为数据对象号,F是文件号,B是块号,R是行号
    32 bit dataobj#+10bit rfile#,+22 bit block# +16bit row#

    在以前ROWID是保持不变的,但现在ROWID是会发生改变的。如:
    把一行从一个分区移到另一个分区
    使用闪回表(flashback table)命令将一个数据表恢复到以前的某个时间点
    对分区进行操作,如:移动,分解和合并
    对段进行收缩
    这些操作都会使ROWID发生变化,所以我们不应该把ROWID来作为唯一标识。而是使用一个单独的列为主键用来作数据行的唯一标识。另外主键约束可以实现引用完整性。而ROWID是无法做到的。

    笔者曾经使用ROWID排序来实现按数据的写入顺序来显示数据。这在大多数情况下是可以做的,但是如果以后因为维护数据库,对分区进行操作后,这样做是不可行的。
    所以应该使用单独的列来记录数据的写入顺序。
    ROWID类型的主要用途是与数据库进行交互时,可以快速的指向某一行。比如使用ROWID更新某一行等。可以不通过索引而快速的找到某行记录。并且可以很快的进行行数据的验证。

  • 相关阅读:
    为什么需要字节对齐?
    从sprintf函数谈符号扩展问题
    sprintf介绍
    char的本质
    使用sprintf连接字符串
    sscanf用法简介
    IE6,IE7,FF | CSS + DIV 兼容问题综合解决方案CSS HACK
    Div+css优点
    MS SQL数据库备份和恢复存储过程(加强版本)
    如何实现HTML页面无刷新更换CSS样式
  • 原文地址:https://www.cnblogs.com/linsond/p/1767970.html
Copyright © 2011-2022 走看看