首页 > 数据库 > mysql教程 > Oracle嵌套表存储格式浅析

Oracle嵌套表存储格式浅析

WBOY
发布: 2016-06-07 16:43:59
原创
841 人浏览过

Oracle嵌套表很少用,下面来研究下其如何存储的。用一个例子,一个用户对应对个部门。

Oracle嵌套表很少用,下面来研究下其如何存储的。用一个例子,一个用户对应对个部门。

SQL> select * from v$version;
 BANNER
 --------------------------------------------------------------------------------
 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
 PL/SQL Release 11.2.0.1.0 - Production
 CORE    11.2.0.1.0      Production
 TNS for Linux: Version 11.2.0.1.0 - Production
 NLSRTL Version 11.2.0.1.0 - Production


SQL> create type t_dept as object(
      dept_id number,
      dept_name varchar2(20)
    )
    /
 SQL> create type t_dept_arry as varray(100) of t_dept
    /
 SQL> create table t_user(
      user_id number,
      user_name varchar2(10),
      depts t_dept_arry
    )
    /
 SQL> insert into t_user values(1,'张三',t_dept_arry(t_dept(100,'开发一组'),t_dept(200,'开发二组')));
SQL> insert into t_user values(2,'李四',t_dept_arry(t_dept(300,'设计一组'),t_dept(400,'设计二组')));
 
SQL> commit;

--要想遍历用户的所有部门信息,需要用table这种特殊的形式
SQL> select user_id,user_name,d.dept_id,d.dept_name from t_user u,table(u.depts) d;
    USER_ID USER_NAME    DEPT_ID DEPT_NAME
 ---------- ---------- ---------- --------------------
          1 张三              100 开发一组
        1 张三              200 开发二组
        2 李四              300 设计一组
        2 李四              400 设计二组
dump block看看:       
block_row_dump:
 tab 0, row 0, @0x3f47
 tl: 81 fb: --H-FL-- lb: 0x1  cc: 3
 col  0: [ 2]  c1 02
 col  1: [ 4]  d5 c5 c8 fd
 col  2: [69]
  00 01 00 00 00 00 00 01 00 00 00 0a e4 23 00 37 09 00 00 00 00 00 00 27 00
  00 00 00 00 01 88 01 27 01 01 00 02 0f 84 01 0f 02 c2 02 08 bf aa b7 a2 d2
  bb d7 e9 0f 84 01 0f 02 c2 03 08 bf aa b7 a2 b6 fe d7 e9
 tab 0, row 1, @0x3ef6
 tl: 81 fb: --H-FL-- lb: 0x1  cc: 3
 col  0: [ 2]  c1 03
 col  1: [ 4]  c0 ee cb c4
 col  2: [69]
  00 01 00 00 00 00 00 01 00 00 00 0a e4 24 00 37 09 00 00 00 00 00 00 27 00
  00 00 00 00 01 88 01 27 01 01 00 02 0f 84 01 0f 02 c2 04 08 c9 e8 bc c6 d2
  bb d7 e9 0f 84 01 0f 02 c2 05 08 c9 e8 bc c6 b6 fe d7 e9
 end_of_block_dump

 insert into t_user values(3,'王五',t_dept_arry(t_dept(500,'家')));
commit;

 block_row_dump:
 tab 0, row 0, @0x3f5d
 tl: 59 fb: --H-FL-- lb: 0x1  cc: 3
 col  0: [ 2]  c1 04
 col  1: [ 4]  cd f5 ce e5
 col  2: [47]
  00 01 00 00 00 00 00 01 00 00 00 0a e4 49 00 21 09 00 00 00 00 00 00 11 00
  00 00 00 00 01 88 01 11 01 01 00 01 09 84 01 09 02 c2 06 02 bc d2
 end_of_block_dump
--看了上面dump的结果,一头雾水,不知道是怎么存的,不过在user_objects中找到线索,有个lob字段
SQL> select object_name,object_type from user_objects s;
 OBJECT_NAME                    OBJECT_TYPE
 ------------------------------ -------------------
 SYS_LOB0000082685C00003$$      LOB
 T_USER                        TABLE
 T_DEPT_ARRY                    TYPE
 T_DEPT                        TYPE

SQL> select column_name, segment_name, index_name
  from user_lobs s
  where s.table_name = 'T_USER';
 COLUMN_NAM SEGMENT_NAME                  INDEX_NAME
 ---------- ------------------------------ ------------------------------
 
DEPTS      SYS_LOB0000082685C00003$$      SYS_IL0000082685C00003$$

--再测试下跟普通的clob有什么区别

drop table test purge;
 create table test
 (
  id number,
  t_clob clob
 );
 insert into test values(1,'开发一组开发二组');
insert into test values(1,'设计一组设计二组');
insert into test values(1,'家');


commit;

选项卡 0,第 0 行,@0x3f5d
 tl: 59 fb: --H-FL-- lb: 0x1  cc: 2
 col 0: [ 2]  c1 02
 col 1: [ 52]
  00 54 00 01 02 0c 80 00 00 02 00 00 00 01 00 00 00 0a e4 4a 00 20 09 00 00
  00 00 00 00 10 00 00 00 00 00 01 5f 00 53 d1 4e 00 7e c4 5f 00 53 d1 4e 8c
  7e c4
 LOB
 定位器:
  长度:        84(52)
  版本:        1
  字节长度:    2
Lob编号:00.00 .00.01.00.00.00.0a.e4.4a
  标志[ 0x02 0x0c 0x80 0x00 ]:
    类型:CLOB
    存储:BasicFile
    启用行存储
    字符集格式:IMPLICIT
分区表:否
选项:varingwidthreadwrite
inode:
size:32
flag:0x09 [有效datainrow]
future:0x00:0x00(应该为'0x00')
块: 0
    字节:    16
  版本:00000.0000000001
    内联数据[16]
 内存从 0x00002AE680C155EC 转储到 0x00002AE680C155FC
 2AE6 80C155E0                            D153005F              [_.S.]
 2AE680C155F0 C47E004E D153005F C47E8C4E          [ N.~._.S.N.~.]   
选项卡 0,第 1 行,@0x3f22
 tl:59 fb:--H-FL-- lb:0x1  cc:2
 col 0:[ 2 ]  c1 02
 第 1 列:[52]
  00 54 00 01 02 0c 80 00 00 02 00 00 00 01 00 00 00 0a e4 4b 00 20 09 00 00
  00 00 00 0 0 10 00 00 00 00 00 01 8b 是 8b a1 4e 00 7e c4 8b 是 8b a1 4e 8c
  7e c4
 LOB
 定位器:
  长度:        84(52)
  版本:        1
字节长度:2
lobid:00.00.00.01.00.00.00.00.0.0a.e4.4b
flags [0x02 0x0c 0x0c 0x80 0x00]:
类型:clob
storege:basicfile     字符集格式:隐式
    分区表:否
    选项:VaringWidthReadWrite
  索引节点:
    大小:    32
    标志:    0x09 [ 有效 DataInRow ]
    未来: 0x00 (应该是 '0x00')
    块:  0
    字节:    16
    版本: 00000.0000000001
    内联数据[16]
 内存从 0x00002AE680C155B1 转储到 0x0 0002AE680C155C1
 2AE680C155B0 8BBE8B01 7E004EA1 8BBE8BC4 7E8C4EA1  [ .....N.~.....N.~]
 2AE680C155C0 02012CC4                            [.,..]           
 选项卡 0,第 2 行,@0x3ef5
 tl: 45 fb: --H -FL-- 磅:0x1 cc:2
 列 0:[ 2]  c1 02
 列 1:[38]
  00 54 00 01 02 0c 80 00 00 02 00 00 00 01 00 00 00 0a e4 4c 00 12 09 00 00
  00 00 00 00 02 00 00 00 00 00 01 5b b6
 LOB
 定位器:
  长度:        84(38)
  版本:       1
  字节长度:    2
  LobID:00.00.00.01.00.00.00.0a.e4.4c
  标志[ 0x02 0x0c 0x80 0x00 ]:
    类型:CLOB
    存储:BasicFile
    启用存储行
    字符集格式:隐式
    分区表:否
    选项:VaringWidthReadWrite
  索引节点:
    大小:    18
    标志:    0x09 [ 有效 DataInRow ]
    未来: 0x00 (应为 '0x00')
    块:  0
    字节:    2
    版本:  00000.0000000001
    内联数据[2]

 一些两次转储的内容,但是还是不能确定是否两者等价:

 00 01 00  00 00 00 00 01 00 00 00 0a e4 49 00 21 09 00 00 00 00 00 00 11 00

 00 00 00 00 01 88 01 11 01 01 00 01 09 84 01 09 02 c2 06公元前 02 日 2

 00 54 00 01 02 0c 80 00 00 02 00 00 00 01 00 00 00 0a e4 4c 00 12 09 00 00

 00 00 00 00 02 00 00 00 00 00 01 5b 6

总结:雕塑是通过lob在雕塑中的内容的,TOM说作为一种存储机制,他更倾向于创建父子表,可以重新创建一个视图,看起来像一个真正的雕塑表一样,洼表适合于编程构造。

在CentOS 6.4下安装Oracle 11gR2(x64)

Oracle 11gR2 在VMWare虚拟机中安装步骤

Debian 下 安装 Oracle 11g XE R2

本文永久更新链接地址:

Oracle嵌套表存储格式浅析

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板