在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會自動根據分區字段的值來選擇存儲的分區。