日期:2014-05-16 浏览次数:20577 次
这里主要验证了number 和 varchar2 两种数据类型null值的存储
先来介绍一下row piece的结构
引用官方文档的一张结构图

通常情况下,不包括(cluster table 和 chain row)一个rowpiece 包括row header 和 column data
关于其他情况,会在以后的研究中陆续放出。
BBED> dump /v
File: /u01/apps/oracle/oradata/david/users01.dbf(4)
Block: 531     Offsets: 8173to 8191  Dba:0x01000213
-------------------------------------------------------
3c020302 c1020353 59530444 55414c01 l<...á..SYS.DUAL.
06fbd4                            l .??
<16 bytes per line>
例如:一个rowpiece的前3个字节 3c0203它表示
1个字节的flag
1个字节的lb(itl slot)
1个字节的columncount
如例中
3c=flag=00111100=--HDFL--=header+delete+first+last
02=lb itl slot 0x02
03=column count
列值信息包括:
列的长度,列的value
例如02c102
表示占用2个byte
c102 表示的是具体的值
dump 的信息 可以使用 UTL_RAW.CAST_TO_xxxx 来翻译(感谢itpub iori809的指导)

下面开始验证
首先环境为11.1.0.6 linux x64
dex@FAKE> desc ts
 Name                                                              Null?    Type
 ----------------------------- -------- --------------------------------------------
 ID                                                                         NUMBER
 NAME                                                                       VARCHAR2(20)
 COUNT                                                                      NUMBER
dex@FAKE> select t.*,
  2         dbms_rowid.rowid_relative_fno(t.rowid) as "FNO#",
  3         dbms_rowid.rowid_block_number(t.rowid) as "BLK#",
  4         dbms_rowid.rowid_row_number(t.rowid) as "ROW#"
  5    from dex.ts t
  6  ;
        ID NAME                      COUNT       FNO#       BLK#       ROW#
---------- -------------------- ---------- ---------- ---------- ----------
         1 dd                                       4         31          0
         2                               2          4         31          1
           2                             3          4         31          2
         4                                          4         31          3
建表语句:dex@FAKE> create table ts ( id number , name varchar2(20) , count number ) ;