
4.1 Oracle基本的数据存储机制-表
表是Oracle数据库中最基本的数据存储结构,是一种逻辑结构,数据在表中以行和列的形式存储。在创建表时,用户需要设定表名、表内各列的列名和各列的数据类型及数据宽度。数据类型包括VARCHAR2、DATE、NUMBER或BLOG等。在表中同一行的所有列信息叫做记录。
下面将主要介绍Oracle的数据类型。
4.1.1 数据的存储类型
在Oracle的相关文档中,Oracle定义了三种数据类型,即:标量数据类型、集合数据类型和关系数据类型,这些数据类型可以用来定义表中列的数据类型。
图4-1是Oracle中数据类型的关系图。

图4-1 Oracle的数据类型
下面依次介绍标量数据类型(Scalar)、集合数据类型(Collection)、关系数据类型(Relationships)
1.标量数据类型
● VARCHAR2(size)和NVARCHAR2(size):变长字符型数据
首先,该数据类型存储变长的字符数据,在使用该数据类型定义数据时,该数据的存储区大小是不固定的,依据存储数据的长度进行动态分配存储区。参数size是该变量存储的最大的字符数,该值最大为4000,最小值或默认值都是1。一般在定义该数据类型时,都要指定该长度值,即指定size值。NVARCHAR2(size)的不同之处在于它支持全球化数据类型,支持定长和变长字符集。
● CHAR(size)和NCHAR(size):定长字符型数据
该数据类型一旦定义,则存储该变量的存储区的大小就固定下来。显然在存储区分配上它不像VARCHAR2(size)和NVARCHAR2(size)数据类型那样具有动态性,但是在实际中,如果可以预测一个变量存储的字符数量,且数量不是很大,则最好还是使用定长字符型数据来定义该变量,这样可以提高存储的效率。因为使用变长字符型数据要不断地计算存储的数据长度,再分配存储数据块,这会消耗计算资源。定长字符型数据的最小值和默认值都为1个字符,最大值为2000。NCHAR(size)的不同之处在于它支持全球化数据类型,支持定长和变长字符集,此时定长字符型数据的最小值和默认值都为1个字节。
● DATE:日期型数据
Oracle服务器使用7个定长的存储区存储日期型数据,它可以年、月、日、时、分和秒。日期型数据的取值范围从公元前4712年1月1日到公元9999年12月31日。
● NUMBER(p,s):数字型数据
参数p指十进制数的中长度,s为该十进制数小数点后的位数,如NUMBER(10,2)表示该数字型数据的中长度为10位,而小数点后为2位。其中参数p的最大值为38,最小值为1,而参数s的最大值为124,最小值为-84。
● CLOB或LONG:用于存储大数据对象,该对象为定长的字符型数据,如学术论文或个人简历等。对于CLOB数据类型的列的操作不能直接使用Oracle数据库指令,需要一个DBMS_LOB的PL/SQL软件包来维护该数据类型的列。
● BLOB或LONG RAW:存储无结构的大对象,如照片、PPT、二进制图像等。它和CLOB数据类型一样,BLOB数据类型的列的操作只能通过PL/SQL软件包DBMS_LOB来实现。
● BFILE:在操作系统文件中存储无结构的二进制对象,显然它是Oracle的外部数据类型,Oracle无法直接维护这些数据类型,必须由操作系统来维护。
● RAW:该数据类型使得数据库可以直接存储二进制数据,在计算机之间传输该类型数据时,数据库不对数据做任何转换,所以该数据类型的存储和传输效率较高,RAW数据类型的最大长度为2000个字节。
注意
LONG和LONG RAW数据类型主要用在Oracle8以前的数据库系统。LONG数据类型完全可以用Oracle9i或Oracle10g的CLOG或BLOB数据类型替换。
2.集合数据类型
Oracle 集合数据类型包括嵌套表和VARRY数据类型。在嵌套表的列值中又包含表,嵌套表中的元素数量没有限制,当然不能超过表所在的表空间的大小,而VARRY集合中的元素是有数量限制的。
3.关系数据类型
关系类型REF指向一个对象,在Oracle数据库中一个典型的REF类型的对象就是游标cursor。
4.1.2 行ID(ROWID)
ROWID也是一种数据类型,但是这种数据类型是Oracle服务器使用并管理的。首先解释ROWID的特性,通过特性可以理解ROWID的作用。
● ROWID是数据库中每一行的唯一标识符。
● ROWID作为列值是隐式存储的。
● ROWID不直接给出行的物理地址,但是可以用ROWID来定位行。
● ROWID提供了最快速地访问表中行的方法。
虽然ROWID为非显示存储,但是对于每一个表,都可以查询该表中每一行的ROWID。下面通过例子查看ROWID,并解释ROWID的组成和各组成部分的含义。
例子4-1 登录数据库并查看表DEPT的行ID(ROWID)
C:\>sqlplus /nolog SQL*Plus: Release 9.0.1.0.1 - Production on 星期四 4月 25 00:19:17 2009 (c) Copyright 2001 Oracle Corporation. All rights reserved. SQL> conn scott/tiger; 已连接。 SQL> select deptno,dname,loc,rowid 2 from dept; DEPTNO DNAME LOC ROWID ------------- ------------------------ --------------------- ---------------------------------------- 10 ACCOUNTING NEW YORK AAAH4EAAIAAAAByAAA 20 RESEARCH DALLAS AAAH4EAAIAAAAByAAB 30 SALES CHICAGO AAAH4EAAIAAAAByAAC 40 OPERATIONS BOSTON AAAH4EAAIAAAAByAAD 50 Marcketing AAAH4EAAIAAAAByAAE
我们选择DEPTNO为20的行,即输出的第二行的ROWID来分析,前六位AAAH4E为数据对象号,在数据库中每个对象都是唯一的。接着三位是AAI,为相对文件号,它和表空间中的一个数据文件对应。接着4为AAAABy为块号,块号为相对文件中存储该行的块的位置,最后3位AAB为行号,行号标识块头中行目录的位置,而使用该行目录的位置可以找到行的起始地址。
说明
本节只要求读者对于ROWID有个了解,知道用ROWID可以唯一标识一行,Oracle使用ROWID可以快速找到一行数据。