Oracle資料庫資料物件分析(上)

tolywang發表於2007-06-29
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;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-84724/,如需轉載,請註明出處,否則將追究法律責任。

相關文章