- OCA/OCP認證考試指南全冊(第3版) Oracle Database 12c(1Z0-061,1Z0-062,1Z0-063) (計算機與信息)
- (美)John Watson等
- 2691字
- 2021-03-26 13:10:16
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將顯示當前用戶模式中每個表的每一列的詳細情況。
- 2019年全國導(dǎo)游人員資格考試輔導(dǎo)教材-全國導(dǎo)游基礎(chǔ)知識
- 銀行業(yè)專業(yè)人員初級職業(yè)資格考試專用教材:風(fēng)險管理(新大綱)
- 2019年山西省農(nóng)村信用社公開招聘工作人員考試復(fù)習(xí)全書【核心講義+歷年真題詳解】
- 啟視未來:2018—2019新東方留學(xué)指南美國研究生
- 2019年執(zhí)業(yè)藥師資格(中藥學(xué)專業(yè)知識二)歷年真題與考前押題詳解
- 經(jīng)濟師《房地產(chǎn)經(jīng)濟專業(yè)知識與實務(wù)(中級)》歷年真題與模擬試題詳解
- 2019年全國導(dǎo)游人員資格考試輔導(dǎo)教材-河北導(dǎo)游服務(wù)能力
- 二級建造師考試指南:市政公用工程管理與實務(wù)
- 駕考寶典
- 企業(yè)法律顧問《綜合法律知識》歷年真題與模擬試題詳解
- 2019年基金從業(yè)資格考試《基金法律法規(guī)、職業(yè)道德與業(yè)務(wù)規(guī)范》過關(guān)必做1000題(含歷年真題)【含模擬試題及詳解】
- 啟視未來:2018—2019新東方留學(xué)指南美國本科
- 社會工作者職業(yè)水平考試考點精講·真題自測:社會工作綜合能力(2017初級)
- 通信工程師考試專用輔導(dǎo)教程:初級通信工程師考試考點精講與全真模擬題
- 2016年5月助理物流師(中物聯(lián))考試過關(guān)必做習(xí)題集(含歷年真題)