Oracle數據庫數據對象分析(上)
2024-08-29 13:30:22
供稿:網友
oracle數據庫數據對象中最基本的是表和視圖,其他還有約束、序列、函數、存儲過程、包、觸發器等。對數據庫的操作可以基本歸結為對數據對象的操作,理解和掌握oracle數據庫對象是學習oracle的捷徑。
表和視圖
oracle中表是數據存儲的基本結構。oracle8引入了分區表和對象表,oracle8i引入了臨時表,使表的功能更強大。視圖是一個或多個表中數據的邏輯表達式。本文我們將討論怎樣創建和管理簡單的表和視圖。
管理表
表可以看作有行和列的電子數據表,表是關系數據庫中一種擁有數據的結構。用create table語句建立表,在建立表的同時,必須定義表名,列,以及列的數據類型和大小。例如:
create table products
( prod_id number(4),
prod_name vaechar2(20),
stock_qty number(5,3)
);
這樣我們就建立了一個名為products的表, 關鍵詞create table后緊跟的表名,然后定義了三列,同時規定了列的數據類型和大小。
在創建表的同時你可以規定表的完整性約束,也可以規定列的完整性約束,在列上普通的約束是not null,關于約束的討論我們在以后進行。
在建立或更改表時,可以給表一個缺省值。缺省值是在增加行時,增加的數據行中某一項值為null時,oracle即認為該值為缺省值。
下列數據字典視圖提供表和表的列的信息:
. dba_tables
. dba_all_tables
. user_tables
. user_all_tables
. all_tables
. all_all_tables
. dba_tab_columns
. user_tab_columns
. all_tab_columns
表的命名規則
表名標識一個表,所以應盡可能在表名中描述表,oracle中表名或列名最長可以達30個字符串。表名應該以字母開始,可以在表名中包含數字、下劃線、#、$等。
從其它表中建立表
可以使用查詢從基于一個或多個表中建立表,表的列的數據類型和大小有查詢結果決定。建立這種形式的表的查詢可以選擇其他表中所有的列或者只選擇部分列。在create table語句中使用關鍵字as,例如:
sql>create table emp as select * from employee
table created
sql> create table y as select * from x where no=2
需要注意的是如果查詢涉及long數據類型,那么create table....as select....將不會工作。
更改表定義
在建立表后,有時候我們可能需要修改表,比如更改列的定義,更改缺省值,增加新列,刪除列等等。oracle使用alter table語句來更改表的定義
1、增加列
語法:
alter table [schema.] table_name add column_definition
例:
alter table orders add order_date date;
table alter
對于已經存在的數據行,新列的值將是null.
2、更改列
語法:
alter table [schema.] table_name modify column_name new_attributes;
例:
alter table orders modity (quantity number(10,3),status varchar2(15));
這個例子中我們修改了表orders,將status列的長度增加到15,將quantity列減小到10,3;
修改列的規則如下:
. 可以增加字符串數據類型的列的長度,數字數據類型列的精度。
. 減少列的長度時,該列應該不包含任何值,所有數據行都為null.
. 改變數據類型時,該列的值必須是null.
. 對于十進制數字,可以增加或減少但不能降低他的精度。
3、刪除數據列
優化oracle數據庫,唯一的方法是刪除列,重新建立數據庫。在oracle8i中有很多方法刪除列,你可以刪除未用數據列或者可以標示該列為未用數據列然后刪除。
刪除數據列的語法是:
alter table [schema.] table_name drop {colum column_names | (column_names)}[cascade constrains]
要注意的是在刪除列時關于該列的索引和完整性約束也同時刪除。注意關鍵字cascade constrains,如果刪除的列是多列約束的一部分,那么這個約束條件相對于其他列也同時刪除。
如果用戶擔心在大型數據庫中刪除列要花太多時間,可以先將他們標記為未用數據列,標記未用數據列的語法如下:
alter table [schema.] table_name set unused {colum column_names | (column_names)}[cascade constrains]
這個語句將一個或多個數據列標記為未用數據列,但并不刪除數據列中的數據,也不釋放占用的磁盤空間。但是,未用數據列在視圖和數據字典中并不顯示,并且該數據列的名稱將被刪除,新的數據列可以使用這個名稱。基于該數據列的索引、約束,統計等都將被刪除。
刪除未用數據列的語句是:
alter table [schema.] table_name drop {unused colum | column continue}
刪除表和更改表名
刪除表非常簡單,但它是一個不可逆轉的行為。
語法:
drop table [schema.] table_name [cascade constraints]
刪除表后,表上的索引、觸發器、權限、完整性約束也同時刪除。oracle不能刪除視圖,或其他程序單元,但oracle將標示他們無效。如果刪除的表涉及引用主鍵或唯一關鍵字的完整性約束時,那么drop table語句就必須包含cascade constraints子串。
更改表名
rename命令用于給表和其他數據庫對象改名。oracle系統自動將基于舊表的完整性約束、索引、權限轉移到新表中。oracle同時使所有基于舊表的數據庫對象,比如視圖、程序、函數等,為不合法。
語法:
rename old_name to new_name;
例:
sql> rename orders to purchase_orders;
table renamed
截短表
truncate命令與drop命令相似, 但他不是刪除整個數據表,所以索引、完整性約束、觸發器、權限等都不會被刪除。缺省情況下將釋放部分表和視圖空間,如果用戶不希望釋放表空間,truncate語句中要包含reuse storage子串。truncate命令語法如下:
truncate {table|cluster} [schema.] name {drop|reuse storage}
例:
sql> truncate table t1;
table truncate.
管理視圖
視圖是一個或多個表中的數據的簡化描述,用戶可以將視圖看成一個存儲查詢(stored query)或一個虛擬表(virtual table).查詢僅僅存儲在oracle數據字典中,實際的數據沒有存放在任何其它地方,所以建立視圖不用消耗其他的空間。視圖也可以隱藏復雜查詢,比如多表查詢,但用戶只能看見視圖。視圖可以有與他所基于表的列名不同的列名。用戶可以建立限制其他用戶訪問的視圖。
建立視圖
create view命令創建視圖,定義視圖的查詢可以建立在一個或多個表,或其他視圖上。查詢不能有for update子串,在早期的oracle8i版本中不支持order by子串,現在的版本中create view可以擁有order by子串。
例:
sql> create view top_emp as
select empno employee_id,ename employee_name,salary
from emp
where salary >2000
用戶可以在創建視圖的同時更改列名,方法是在視圖名后立即加上要命名的列名。重新定義視圖需要包含or replace子串。
sql> create view top_emp
(employee_id,employee_name,salary) as
select empno ,ename ,salary
from emp
where salary >2000
如果在創建的視圖包含錯誤在正常情況下,視圖將不會被創建。但如果你需要創建一個帶錯誤的視圖必須在create view語句中帶上force選項。如:
create force view order_status as
select * from purchase_orders
where status='apppove';
sql>/
warning :view create with compilation errors
這樣將創建了一個名為order_status的視圖,但這樣的視圖的狀態是不合法的,如果以后狀態發生變化則可以重新編譯,其狀態也變成合法的。
從視圖中獲得數據
從視圖中獲得數據與從表中獲得數據基本一樣,用戶可以在連接和子查詢中使用視圖,也可以使用sql函數,以及所有select語句的字串。
插入、更新、刪除數據
用戶在一定的限制條件下可以通過視圖更新、插入、刪除數據。如果視圖連接多個表,那么在一個時間里只能更新一個表。所有的能被更新的列可以在數據字典user_updatetable_columns中查到。
用戶在create view中可以使用了with子串。with read only子串表示創建的視圖是一個只讀視圖,不能進行更新、插入、刪除操作。with check option表示可以進行插入和更新操作,但應該滿足where子串的條件。這個條件就是創建視圖where子句的條件,比如在上面的例子中用戶創建了一個視圖top_emp,在這個視圖中用戶不能插入salary小于2000的數據行。
刪除視圖
刪除視圖使用drop view命令。同時將視圖定義從數據字典中刪除,基于視圖的權限也同時被刪除,其他涉及到該視圖的函數、視圖、程序等都將被視為非法。
例:
drop view top_emp;