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

5.2 分類主要的數(shù)據(jù)庫對象

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

5.2.1 對象類型

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

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

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

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

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

5.2.2 用戶和模式

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

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

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

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

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

5.2.3 命名模式對象

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

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

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

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

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

● 小寫字母將自動轉(zhuǎn)換為大寫字母。

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

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

提示:

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

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

        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 對象名稱空間

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

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

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

● 視圖 ● 獨立的存儲函數(shù) ● 物化視圖

● 序列

● 私有同義詞

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

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

● 約束 ● 私有數(shù)據(jù)庫鏈接

● 群集 ● 維度

● 數(shù)據(jù)庫觸發(fā)器

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

考點:

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

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

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

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

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

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

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

(3) 確定HR有權(quán)訪問的對象的總數(shù):

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

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

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

        select distinct owner
        from all_objects;

5.3 列舉列可用的數(shù)據(jù)類型

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

下面的數(shù)據(jù)類型適用于字母數(shù)字數(shù)據(jù):

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

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

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

提示:

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

下面的數(shù)據(jù)類型適用于二進制數(shù)據(jù):

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

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

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

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

INTEGER 相當于NUMBER,小數(shù)位數(shù)為零。

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

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

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

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

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

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

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

下面是大對象數(shù)據(jù)類型:

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

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

BLOB 和CLOB一樣,但二進制數(shù)據(jù)不會被Oracle Net執(zhí)行字符集轉(zhuǎn)換。

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

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

LONG RAW 和LONG一樣,但Oracle Net不會轉(zhuǎn)換二進制數(shù)據(jù)。所有LONG RAW列都應(yīng)該轉(zhuǎn)換為BLOB。

下面是ROWID數(shù)據(jù)類型:

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

考點:

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

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

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

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

練習(xí)5-2 研究HR模式中的數(shù)據(jù)類型

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

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

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

        describe employees;
        describe departments;

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

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

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

主站蜘蛛池模板: 苏州市| 英山县| 安龙县| 宜阳县| 页游| 英山县| 洪洞县| 大冶市| 达州市| 垦利县| 垫江县| 峨边| 神农架林区| 中方县| 昂仁县| 贞丰县| 邵阳县| 上高县| 成都市| 南部县| 太仆寺旗| 永济市| 朝阳市| 武强县| 盐源县| 孟州市| 巫山县| 无锡市| 乌拉特前旗| 大邑县| 永嘉县| 五常市| 吉林市| 昌乐县| 吉林省| 开江县| 兴安盟| 屯昌县| 象州县| 永清县| 沈丘县|