Oracle DBA基础教程
上QQ阅读APP看书,第一时间看更新

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可以快速找到一行数据。