官术网_书友最值得收藏!

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

主站蜘蛛池模板: 盐城市| 文山县| 新干县| 仲巴县| 元阳县| 桑植县| 凤冈县| 来凤县| 舟山市| 瑞安市| 苏州市| 大港区| 于田县| 靖西县| 赤城县| 西充县| 柳河县| 温宿县| 南靖县| 旅游| 兰州市| 林口县| 宜君县| 松滋市| 札达县| 承德县| 临漳县| 绩溪县| 化州市| 友谊县| 奉新县| 年辖:市辖区| 桂平市| 教育| 彰武县| 蚌埠市| 桃源县| 德钦县| 敦煌市| 延边| 中宁县|