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

5.2 分類主要的數據庫對象

數據庫內有各種不同類型的對象,當前版本的對象比早期版本的對象更多。所有對象都有名稱,所有的對象都由某人擁有。“某人”是一個數據庫用戶,例如HR,用戶擁有的對象就是其模式。對象的名稱必須遵循某些規則。

5.2.1 對象類型

下面這個查詢列出了某個特定數據庫中存在的對象類型,并計算有多少種:

        SQL> select object_type, count(object_type)
            from dba_objects
            group by object_type
            order by object_type;

       OBJECT_TYPE   COUNT(OBJECT_TYPE)     OBJECT_TYPE    COUNT(OBJECT_TYPE)

       ------------  -----------------      --------------- ------------------
        CHAIN                         1      PACKAGE                       1321
        CLUSTER                      10      PACKAGE BODY                  1259
        CONSUMER GROUP               20      PROCEDURE                      196
        CONTEXT                      10      PROGRAM                         10
        DESTINATION                   2      QUEUE                           30
        DIMENSION                     5      RESOURCE PLAN                   13
        DIRECTORY                    14      RULE                              3
        EDITION                       1      RULE SET                        22
        EVALUATION CONTEXT           16      SCHEDULE                          4
        FUNCTION                   350       SCHEDULER GROUP                   4
        INDEX                     4514       SEQUENCE                       273
        INDEX PARTITION            492       SYNONYM                      37018
        INDEXTYPE                     8      TABLE                         2603
        JAVA CLASS               30942       TABLE PARTITION                408
        JAVA DATA                  325       TABLE SUBPARTITION              32
        JAVA RESOURCE              979       TRIGGER                        611
        JAVA SOURCE                   2      TYPE                          2527
        JOB                          29      TYPE BODY                      226
        JOB CLASS                    15      UNDEFINED                       17
        LIBRARY                    224       UNIFIED AUDIT POLICY              7
        LOB                        921       VIEW                          6189
        LOB PARTITION                15      WINDOW                            9
        MATERIALIZED VIEW             2      XML SCHEMA                      49
        OPERATOR                     55
        47 rows selected.

這個查詢從視圖DBA_OBJECTS中檢索對象,數據庫中的每個對象都有一行。對象的種類很少,因為這個數據庫很小,它只用于教學。商業應用程序使用的數據庫可能有更多的對象。是否可以查看視圖DBA_OBJECTS,取決于賬戶擁有的權限。另一種視圖是USER_OBJECTS,它會顯示用戶擁有的所有對象;ALL_OBJECTS會顯示用戶能夠訪問的所有對象(包括用戶擁有的對象)。所有用戶都能訪問這些視圖。在12c 數據庫中,新增的視圖以CDB_作為前綴,提供了新的多租戶數據庫功能,該功能邏輯上把傳統的數據庫分隔為一個容器和可選的多個可插入數據庫。

SQL編程人員最感興趣的對象是包含或者能夠訪問數據的對象。它們是表、視圖、同義詞、索引和序列。

表以行和列的形式存儲數據。視圖是存儲的SELECT語句,可以像表一樣引用它。它僅僅是一個命名的查詢,用戶不是運行語句本身,而是對視圖發出SELECT語句。實際上,用戶是從另一個選擇結果中進行選擇。同義詞是表(或視圖)的別名。用戶可以對同義詞執行SQL語句,數據庫將把它們映射成為針對同義詞所指的對象執行的語句。索引可以減少對表中行的訪問次數。如果查詢只需要一行,那就不用掃描整個表來找到這一行,因為索引可以提供一個指向該行的確切位置的指針。當然,必須搜索索引本身,但這通常比掃描整個表要快。序列是一種生成唯一數字的結構。序列按要求有序地發出數字。

其余的對象類型并不是SQL編程人員所常用的,而是更多地被PL/SQL編程人員和數據庫管理員使用。

5.2.2 用戶和模式

許多人都互換地使用術語“用戶”和“模式”。在Oracle環境中,可以不再這么使用(但其他數據庫管理系統就不一定了)。用戶是一個可以連接數據庫的人,用戶有用戶名和密碼,模式是包含用戶所擁有對象的容器。創建用戶時,其模式也就創建了。模式是用戶擁有的對象,最初,模式是空的。

一些模式總是空的,用戶永遠不會創建任何對象,因為他們不需要創建對象,(如果設置正確)也沒有必要的權限。這種用戶會通過直接授權或者通過角色獲得權限,以使用代碼訪問其他用戶擁有的其他模式中的數據。其他用戶可能與此相反,他們擁有許多對象,但從來不會登錄數據庫。他們甚至可能沒有被授予CREATE SESSION權限,所以賬戶是禁用的(或者可以被鎖定);這些模式用作其他人訪問的代碼和數據的資源庫。

模式對象是有擁有者的對象。特定類型的對象的唯一標識符不是它的名稱,而是在該名稱的前面加上它所屬模式的名稱。因此,表HR.REGIONS指的是表REGIONS,由用戶HR所有。還可能有另一個表SYSTEM. REGIONS,這是一個完全不同的表(也許結構和內容都不同),由用戶SYSTEM所有,位于他的模式下。

在創建數據庫時,會自動創建許多用戶(及其相關的模式)。其中最重要的是SYS和SYSTEM。用戶SYS擁有數據字典,數據字典是一組表(在SYS模式下),定義了數據庫及其內容。SYS還擁有幾百個PL/SQL包,它們包含的代碼供數據庫管理員和開發人員使用。SYS模式中的對象永遠都不能用DML(數據操縱語言)命令修改。如果要對數據字典表執行DML,就可能破壞數據字典,造成災難性后果。運行DDL命令(例如CREATE TABLE)可以更新數據字典,這會在我們和數據字典之間提供一個抽象層。SYSTEM模式存儲各種用于管理和監控的附加對象。

根據數據庫創建過程中選擇的選項,可能會創建更多的用戶。這些用戶存儲各種數據庫選項需要的代碼和數據。例如,用戶MDSYS存儲Spatial使用的對象,這個選項擴展了Oracle數據庫的功能,使之能管理地理信息。

5.2.3 命名模式對象

模式對象歸用戶所有。所有模式對象的名稱都必須符合一定規則:

● 名稱可以是1~30個字符長(數據庫鏈接名除外,它可以達到128個字符長)。

● 保留字(如SELECT)不能用作對象名稱。

● 所有名稱必須以A~Z的字母開頭。

● 名稱中的字符只能是字母、數字、下劃線(_)、美元符號($)或者井字符號(#)。

● 小寫字母將自動轉換為大寫字母。

通過將名稱括在雙引號內,所有這些規則(除長度之外)都可以打破,但在后面使用對象時,也一定要用雙引號指定它,如圖5-5的示例所示。注意同樣的限制也適用于列名稱。

圖5-5 利用雙引號來使用非標準名稱

提示:

對象名稱不能超過30個字符。字符可以是字母、數字、下劃線、美元符號或者井字符號。

雖然像SQL*Plus和SQL Developer這樣的工具會自動將小寫字母轉換為大寫字母(除非名稱包含在雙引號內),但是請記住,對象名稱總是區分大小寫的。在下面這個示例中,兩個表完全不同:

        SQL> create table lower(c1 date);
        Table created.
        SQL> create table "lower"(col1 varchar2(2));
        Table created.
        SQL> select table_name from dba_tables where lower(table_name) = 'lower';
        TABLE_NAME
        ------------------------------
        lower
        LOWER

注意:

盡管使用小寫字母名稱和非標準字符(甚至空格)是可以的,但這種做法并不好,因為可能引起混淆。

5.2.4 對象名稱空間

一般而言,對象的唯一標識符是前綴為模式名的對象名稱。但要全面理解對象的命名,還需要引入名稱空間的概念。名稱空間定義了一組對象類型,在這個組中,所有名稱都必須由模式和名稱唯一標識。不同名稱空間中的對象可以共享相同的名稱。

下面這些對象類型都共享相同的名稱空間。

● 表 ● 獨立的過程 ● 程序包 ● 用戶定義類型和運算符

● 視圖 ● 獨立的存儲函數 ● 物化視圖

● 序列

● 私有同義詞

因此不可能創建一個名稱與表名相同的視圖——至少,如果它們在相同的模式中,這是不可能的。一旦創建,SQL語句就會將視圖當作表一樣查找。表、視圖和私有同義詞共享相同的名稱空間,這一點說明可以在用戶看到的和實際的表之間建立幾個抽象層,這對于安全性和簡化應用程序開發來說都彌足珍貴。

下列對象類型都有自己的名稱空間。

● 約束 ● 私有數據庫鏈接

● 群集 ● 維度

● 數據庫觸發器

因此,即使是在同樣的模式中,索引的名稱也可能與表名相同(盡管不是個好主意)。

考點:

在同一個模式中,表、視圖和同義詞不能同名。

練習5-1 確定會話可以訪問哪些對象

在這個練習中,將以用戶HR身份來查詢各種數據字典視圖,確定HR模式中有哪些對象以及HR可以訪問其他模式中的哪些對象。如果數據庫中沒有HR模式,請按照第7章中的指令創建它。

(1) 使用SQL*Plus或者SQL Developer,以用戶HR身份連接到數據庫。

(2) 確定HR模式中各種類型的對象數量:

        select object_type, count(*)
        from user_objects
        group by object_type;

USER_OBJECTS視圖將列出當前會話連接的模式(這里是HR)擁有的所有對象。

(3) 確定HR有權訪問的對象的總數:

        select object_type, count(*)
        from all_objects
        group by object_type;

ALL_OBJECTS視圖將列出用戶能夠訪問的所有對象。

(4) 確定誰擁有HR能夠看見的對象:

        select distinct owner
        from all_objects;

5.3 列舉列可用的數據類型

當創建表時,每一列都分配一種數據類型,它決定了可以插入該列的值的特性。這些數據類型也用來指定PL/SQL過程和函數的參數的特性。選擇數據類型時,必須考慮要保存的數據以及要在其上執行的操作。空間也是需要考慮的事項:有些數據類型是固定長度的,不管其中是什么數據,都占用相同的字節數;有些數據類型的長度則是可變的。如果沒有填充列,那么Oracle根本不會給它提供任何空間。如果后面更新行來填充列,那么行會變得更大,而不管數據類型是固定長度還是可變長度。在12c數據庫中,新的系統參數MAX_STRING_SIZE允許字符串數據類型從其默認值STANDARD改為EXTENDED時,比以前的版本大得多。

下面的數據類型適用于字母數字數據:

VARCHAR2 可變長度的字符數據,如果MAX_STRING_SIZE=STANDARD,其長度就是從1B到4KB,如果MAX_STRING_SIZE=EXTENDED,其長度至多32 767字節。數據保存在數據庫字符集中。

NVARCHAR2 和VARCHAR2一樣,但數據保存在國家語言字符集(它是許可的Unicode字符集之一)中。

CHAR 固定長度的字符數據,從1B到2KB,它保存在數據庫字符集中。如果數據的長度比列的長度短,就會用空格進行填充。

提示:

為了符合ISO/ANSI,可以指定VARCHAR數據類型,但這種類型的所有列都會自動轉換為VARCHAR2。

下面的數據類型適用于二進制數據:

RAW 變長的二進制數據,如果MAX_STRING_SIZE=STANDARD,則其長度為1~4000字節;如果MAX_STRING_SIZE=EXTENDED,則其長度可達32 767字節。與CHAR和VARCHAR2數據類型不同,在執行SELECT命令時,Oracle Net不會將RAW數據從數據庫的字符集轉換為用戶進程的字符集,或者在執行INSERT命令時進行反向轉換。

下面的數據類型適用于數字數據,它們都是可變長度的:

NUMBER 數字數據,可以指定它的精度和小數位數。精度范圍是1~38,小數位數范圍是從-84~127。

FLOAT 這是一個ANSI數據類型,精度為126位二進制、38位十進制的浮點數。Oracle還提供BINARY_FLOAT和BINARY_DOUBLE作為備選。

INTEGER 相當于NUMBER,小數位數為零。

下面的數據類型適用于日期和時間數據,它們都是固定長度的:

DATE 它的長度為零(如果列為空)或者7個字節。所有DATE數據都包含世紀、年、月、日、時、分和秒。其有效范圍為公元前4712年1月1日至公元9999年12月31日。

TIMESTAMP 如果列為空,那么它的長度為零,或者達到11字節(這取決于指定的精度)。與DATE類似,但對秒而言,其精度最多為9位,默認為6位。

TIMESTAMP WITH TIMEZONE 和TIMESTAMP一樣,但在保存數據時可以指定時區。根據精度,長度可能達到13個字節。該數據類型讓Oracle通過將兩個時間規范化為UTC來確定它們之間的差,即使這兩個時間在不同的時區。

TIMESTAMP WITH LOCAL TIMEZONE 和TIMESTAMP一樣,但數據在保存時被規范化為數據庫時區。當檢索時,將其規范化為選擇它的用戶進程所在的時區。

INTERVAL YEAR TO MONTH 用于記錄兩個DATE或者TIMESTAMP之間以年和月為單位的時間間隔。

INTERVAL DAY TO SECOND 用于記錄兩個DATE或者TIMESTAMP之間以天和秒為單位的時間間隔。

下面是大對象數據類型:

CLOB 保存在數據庫字符集中的字符數據,大小沒有限制:(4GB-1)×數據庫塊的大小。

NCLOB 和CLOB一樣,但數據保存在可選的國家語言字符集(它是許可的Unicode字符集之一)中。

BLOB 和CLOB一樣,但二進制數據不會被Oracle Net執行字符集轉換。

BFILE 定位器,它指向保存在數據庫服務器的操作系統上的文件。文件的大小限制為264-1,但操作系統可以使用其他限制。

LONG 數據庫字符集中的字符數據,大小可達到2GB-1。LONG的所有功能(甚至更多)都由CLOB提供,不能在現代數據庫中使用LONG,如果數據庫有這種類型的列,應該將它們轉換為CLOB。在表中只能有一個LONG列。

LONG RAW 和LONG一樣,但Oracle Net不會轉換二進制數據。所有LONG RAW列都應該轉換為BLOB。

下面是ROWID數據類型:

ROWID 以64為基數編碼的值,它是一個指向表中行的位置的指針。它加密了。它里面是物理地址。ROWID是Oracle專有的數據類型,除非特別選擇,否則不可見。

考點:

所有考生都應該了解下面這些數據類型:VARCHAR2、CHAR、NUMBER、DATE、TIMESTAMP、INTERVAL、RAW、LONG、LONG RAW、CLOB、BLOB、BFILE和ROWID。還要詳細了解VARCHAR2、NUMBER和DATE。

VARCHAR2數據類型必須用一個數來限定,這個數表示列的最大長度。如果插入列的值小于這個值,那么沒有問題:這個值只占用必要的空間。如果這個值比最大值還長,那么INSERT會出現錯誤。如果將值更新為更長或者更短的值,那么列的長度(和行本身)也會相應改變。如果沒有輸入,或者更新為NULL,那么它根本不會占用空間。

可以使用精度和小數位數來限定NUMBER數據類型。精度設置數中的最大位數,最高位是最左端的非0數字,最低位是數中最右邊的數字。小數位數是從小數點到最低位的位數。正的小數位數是小數點右邊(包括它本身)到最低位的位數。負的小數位數是小數點左邊(不包括它本身)到最低位的位數。

DATE數據類型總是包括世紀、年、月、日、時、分和秒——即使在插入時沒有指定所有這些元素。必須指定年、月和日。如果省略時、分和秒,那么它們會默認為午夜。在日期上使用TRUNC函數,還可以把時、分和秒設置為午夜。

練習5-2 研究HR模式中的數據類型

在這個練習中,將通過兩種方法找出在HR模式中表使用的數據類型:

(1) 使用SQL*Plus或者SQL Developer,以用戶HR身份連接到數據庫。

(2) 使用DESCRIBE命令顯示某些表中的數據類型:

        describe employees;
        describe departments;

(3) 像DESCRIBE命令那樣,查詢數據字典視圖,顯示組成EMPLOYEES表的列:

        select column_name, data_type, nullable, data_length, data_precision, data_scale
        from user_tab_columns
        where table_name='EMPLOYEES';

視圖USER_TAB_COLUMNS將顯示當前用戶模式中每個表的每一列的詳細情況。

主站蜘蛛池模板: 乡宁县| 汝南县| 松阳县| 曲松县| 方山县| 新宁县| 绥滨县| 京山县| 阜新市| 杨浦区| 柳林县| 桂阳县| 南京市| 凉城县| 栖霞市| 镇雄县| 宜黄县| 涪陵区| 安化县| 蚌埠市| 神池县| 英超| 阿克陶县| 垫江县| 阳西县| 信丰县| 太原市| 绥阳县| 东乡族自治县| 遂溪县| 阿克陶县| 清流县| 霞浦县| 大港区| 射洪县| 襄垣县| 炎陵县| 元阳县| 大田县| 全椒县| 龙州县|