2021年4月7日 星期三

9.2 資料庫物件介紹

在介紹 Oracle 資料庫物件之前,首先必須先了解 “Schema” 這個概念。所謂的 “Schema” 定義上就是 “特定名稱所擁有的物件集合” ,例如在 HR 這個使用者底下建立了許多 Table 、 Index 、 Procedure …等物件,那麼這個 HR 就是一個 “HR Schema” ,在 Oracle 資料庫裡面,使用者(User) 與 “Schema” 兩者是沒有區分的,因為 Oracle 資料庫的物件都是建立在使用者 (User) 底下,所以使用者(User) 就等同於 “Schema”;而其它類型的資料庫像是 SQL Server 、 DB2…等,就有把使用者(User) 與 “Schema” 區分開來,例如 SQL Server 的 “dbo” 就是一個 “Schema” ,也就是物件的擁有者是屬於 “dbo” 而不是一個登入的使用者(User)。


Oracle 資料庫物件可以分為 Schema Objects 與 PL/SQL Objects 兩大類, Schema Objects 指的就是 Table 、 Index 、 View 、 Constraint 、 Sequence ,以及 Synonym 這些物件;而 PL/SQL Objects 指的就是程式相關的物件,像是 Procedure 、 Function 、 Package ,以及 Trigger,所有的物件資訊都存放在 Data Dictionary 裡面,例如由 dba_objects 可以查詢到所有的物件名稱、類型、擁有者…等資訊;由 dba_tables 可以查詢所有與 Table 相關的資訊;由 dba_indexes 則可以查詢所有與 Index 相關的資訊,我們可以透過 dict 這個系統所提供的 view 來查詢有哪些 Data Dictionary 可以使用,例如我們想要知道與 Constraint 相關的 Data Dictionary 有哪些就可以使用下列查詢:

SQL> select * from dict where table_name like '%CONSTRAINT%';


透過 dict ,我們就知道從 dba_constraints 可以查詢與 Constraint 相關的資訊。


這邊要注意的是,所有儲存在 Data Dictionary 的物件名稱都是以 “大寫” 來表達,必須要使用 “大寫” 才查得到物件名稱,而我們在建立物件的時候,不論是以 “大寫” 或 “小寫” 來表達,最終在 Data Dictionary 裡面的名稱一律為 “大寫”,但是如果我們在建立物件的時候使用雙引號將物件名稱括起來,那麼這時候儲存進 Data Dictionary 時就會有大小寫之分,例如建立兩個 Table ,tab1 與 tab2 ,而 tab2 有使用雙引號:

SQL> create table tab1 (a number, b varchar2(20));

SQL> create table "tab2" (a number, b varchar2(20));


此時從 Data Dictionary 查詢時,會發現 tab1 是以 “大寫” 作為儲存,而 tab2 會是 “小寫”:


而我們使用一個查詢時,資料庫會去 Data Dictionary 檢查這個物件是否存在,而檢查時預設是以 “大寫” 來尋找物件名稱,如果我們不小心將 “小寫” 的物件名稱存入 Data Dictionary ,那麼就有可能系統會回報找不到此物件,此時會發生一個詭異的現象,明明剛剛建了 tab1 與 tab2 兩個 Table,但 tab2 卻發生不存在的現象:


此時必須要再使用雙引號才能夠查詢 tab2 :


為了避免這個問題,所以非常不建議在 Oracle 資料庫建立任何物件時加上雙引號。


Oracle 資料庫物件名稱的長度最大為 30 bytes ,到了 Oracle 12.2 的版本之後,最大長度可以到 128 bytes ,但 Tablespace Name 、 Disk Group Name 、 Pluggable Database Name ,還是只能到 30 bytes;而 Database Name 則是一律限制在 8 bytes; Database Link Name 則是都可以到 128 bytes 。


Oracle 資料庫物件的命名規則在不使用雙引號的情況下,必須以文字作為開頭,否則就會出現 “ORA-00903: invalid table name” 這個錯誤:


在了解 Oracle 資料庫物件的規則之後,接下來我們就可以來建立各種物件了。




沒有留言:

張貼留言