DB2——臨時表
一、臨時表
臨時表(TEMPORARY TABLE)通常應用在需要定義臨時集合的場合。但是,在大部分需要臨時集合的時候,我們根本就不需要定義臨時表。當我們在一條SQL語句中只使用一次臨時集合時,我們可以使用嵌套表表達式來定義臨時集合;當我們在一條SQL語句中需要多次使用同一臨時集合時,我們可以使用公共表表達式;只有當我們在一個工作單元中的多條SQL語句中使用同一臨時集合時,我們才需要定義臨時表。
方法1:
DECLARE GLOBAL TEMPORARY TABLE SESSION.EMP
(
NAME VARCHAR(10),---姓名
DEPT SMALLINT,---部門
SALARY DEC(7,2)---工資
)
ON COMMIT DELETE ROWS;
方法2:
DECLARE GLOBAL TEMPORARY TABLE session.emp
LIKE staff INCLUDING COLUMN DEFAULTS
WITH REPLACE
ON COMMIT PRESERVE ROWS;
方法3:
DECLARE GLOBAL TEMPORARY TABLE session.emp AS
(
SELECT * FROM staff WHERE <condition>
)
DEFINITION ONLY
WITH REPLACE;
方法4:
DECLARE GLOBAL TEMPORARY TABLE session.emp ( NAME VARCHAR(10),---姓名 DEPT SMALLINT,---部門 SALARY DEC(7,2)---工資 ) ON COMMIT PRESERVE ROWS NOT LOGGED WITH REPLACE;
二、全局聲明式臨時表
ON COMMIT PRESERVE ROWS定義聲明式全局臨時表 定義聲明式全局臨時表的每個會話擁有自己的獨特的臨時表描述。當會話終止時,錶行和臨時表描述均會被刪除。 有如下選項,可控制commit後臨時表的狀態:
ON COMMIT DELETE ROWS:在執行 COMMIT 操作時,如果表上沒有打開 WITH HOLD 遊標,就刪除表中的所有行。這是默認設置。
ON COMMIT PRESERVE ROWS:在執行 COMMIT語句指定所創建的臨時表是會話級臨時表,當我們斷開連接或手動執行DELETE或TRUNCATE之前,臨時表中的數據一直存在,並且只有當前會話可以看到,其他會話看不到。
ON ROLLBACK DELETE ROWS:在執行 ROLLBACK(或 ROLLBACK to SAVEPOINT)操作時,語句指定所創建的臨時表是事務級臨時表,當COMMIT或ROLLBACK之前,這些數據一直存在,當事務提交之後,表中數據自動清除。這是默認設置。
ON ROLLBACK PRESERVE ROWS:在執行 ROLLBACK(或 ROLLBACK to SAVEPOINT)操作時,保留表中的所有行。
delete rows用於事務相關,也就在事務結束後truncate data in the temporary table
with replace 指在程序結束後自動刪除該臨時表
as 指字段從另外一個表來的意思
definition only 指創建表的時候不同時進行數據插入。關鍵字就是指“只定義無數據"只創建表
1.在建表語句中使用NOT LOGGED INITIALLY,只是在建表事務中不記日記,並不能關閉這張表的日誌。2.如果需要不記錄事務日誌,需要在每個事務的開頭使用 db2 alter table dbname activate NOT LOGGED INITIALLY 然後做commit.這裏的不記日誌操作,僅僅在同一個事務內有效,也就是說,這個事務結束(發出了commit命令)之後,後續操作會重新記錄日誌3.可以使用NOT LOGGED INITIALLY 做清空表的操作。 用法: alter table nolog_tab activate not logged initially with empty table commit
preserve rows表示在會話結束後清除臨時表的數據
前者在事務提交後數據就已經清除了.
後者在會話中止時或者導常退出時數據都會被清除掉
ORACLE——臨時表
CREATE GLOBAL TEMPORARY TABLE session.emp (
NAME VARCHAR(10),---姓名
DEPT SMALLINT,---部門
SALARY DEC(7,2)---工資
)
ON COMMIT PRESERVE ROWS;
創建索引:
DB2:
CREATE INDEX idxName ON tabName (cols) COLLECT STATISTICS
ORACLE:
CREATE INDEX idxName ON tabName (cols)
定義了臨時表後,我們可以像使用普通表一樣使用臨時表。臨時表只對定義它的用戶有效,不同用戶可以在同一時間定義同名的臨時表,他們之間互不影響。臨時表的生命週期是SESSION,當SESSION關閉時,臨時表將自動刪除,這也是臨時表的模式名只能爲SESSION的原因。此外,我們還可以給臨時表定義索引。