一、臨時表
臨時表(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;
二、全局聲明式臨時表
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表示在會話結束后清除臨時表的數據
前者在事務提交后數據就已經清除了.
后者在會話中止時或者導常退出時數據都會被清除掉
定義了臨時表后,我們可以像使用普通表一樣使用臨時表。臨時表只對定義它的用戶有效,不同用戶可以在同一時間定義同名的臨時表,他們之間互不影響。臨時表的生命周期是SESSION,當SESSION關閉時,臨時表將自動刪除,這也是臨時表的模式名只能為SESSION的原因。此外,我們還可以給臨時表定義索引。更多細節請參考DB2 信息中心。
----更多參見:DB2 SQL 精萃
