Oracle中的暫存資料表、外部表格和分區表
暫存資料表
在Oracle中,暫存資料表是“靜態”的,它與普通的資料表一樣只需要一次建立,其結構從建立到刪除的整個期間都是有效。相對於其他類型的表,暫存資料表只有在使用者實際向表中添加資料時,才會為其分配空間,並且分配的空間來自暫存資料表空間。這就避免了與永久對象的資料爭用儲存空間。
建立暫存資料表的文法如下:
CREATE GLOBAL TEMPORARY TABLE table_name( column_name data_type,[column_name data_type,...] )ON COMMIT DELETE|PRESERVE ROWS;
由於暫存資料表儲存的資料只在當前交易處理或者會話進行期間有效
因此,暫存資料表分為事務級暫存資料表和會話級暫存資料表。
事務級暫存資料表
建立事務級暫存資料表,需要使用ON COMMIT DELETE ROWS子句,事務級暫存資料表的記錄在每次提交事務後被自動刪除。
例1:
CREATE GLOBAL TEMPORARY TABLE tbl_user_transcation( ID NUMBER, uname VARCHAR2(10), usex VARCHAR2(2), ubirthday DATE ) ON COMMIT DELETE ROWS;
會話級暫存資料表
建立會話級暫存資料表,需要使用ON COMMIT PRESERVE ROWS子句,會話級暫存資料表的記錄在使用者與伺服器中斷連線後被自動刪除。
例2:
CREATE GLOBAL TEMPORARY TABLE tbl_user_session( ID NUMBER, uname VARCHAR2(10), usex VARCHAR2(2), ubirthday DATE ) ON COMMIT PRESERVE ROWS;
操作暫存資料表
對事務級暫存資料表插入一條資料但不COMMIT事務:
INSERT INTO tbl_user_transcation VALUES(1,'siege','M',TO_DATE('1991-02-28','YYYY-MM-DD')); SELECT * FROM tbl_user_transcation;
此時,查詢結果如下:
1 siege M 28/02/1991
若進行了COMMIT,則此時表中無資料,說明Oracle已經將資料刪除了。
對事務級暫存資料表插入一條資料:
INSERT INTO tbl_user_session VALUES(1,'siege','M',TO_DATE('1991-02-28','YYYY-MM-DD')); SELECT * FROM tbl_user_session; COMMIT;
此時即使提交了事務,tbl_user_session 中仍有資料。
此時當關閉session後(斷開資料庫連接),再串連資料庫,查詢時則無資料了。
註:在PL/SQL Developer預設配置為開啟一個視窗,即重建立立一個session,因此要注意設定共用session,
外部表格
外部表格是Oracle提供的、可讀取作業系統的檔案系統中儲存的資料的一種唯讀表。外部表格中的資料存放區在作業系統的檔案系統中,只能讀,不能修改。
建立外部表格
先以SYSDBA身份登入,授予使用者相關許可權:
GRANT CREATE ANY DIRECTORY TO siege;
然後以使用者身份登入建立目錄:
CREATE DIRECTORY external_student AS 'D:\';
最後建立外部表格:
例3:
CREATE TABLE tbl_external_student( sid NUMBER , sname VARCHAR2(10), sclass VARCHAR2(3), ssubject VARCHAR2(12), sscore NUMBER ) ORGANIZATION EXTERNAL ( TYPE oracle_loader DEFAULT DIRECTORY external_student ACCESS PARAMETERS(FIELDS TERMINATED BY ',') LOCATION ('student.csv') )
註:外部的D盤下的檔案student.csv如下所示:
10001,siege,304,physics,80
查詢tbl_external_student與上述顯示一致。
分區表
在大型資料庫應用中,需要處理的資料量甚至可以達到TB級。為了提高讀寫和查詢速度,Oracle提供了一種分區技術,使用者可以在建立表時應用分區技術,將資料以分區形式儲存。
分區是指將表或索引分隔成相對較小的、可獨立管理的部分。分區後的表與未分區的表在執行DML語句時沒有任何區別。
對錶進行分區,必須為表中的每一條記錄指定所屬分區。一條記錄屬於哪一個分區是由分區表對該記錄的匹配欄位決定的。分區欄位可以是表中的一個欄位或者多個欄位的組合,在建立分區表時決定的。當使用者對分區表進行插入、更新或者刪除時,Oracle會自動根據分區欄位的值來選擇儲存的分區。