暫存表關鍵規則
- 建立語法: `DECLARE GLOBAL TEMPORARY TABLE ...`(非 `CREATE`),必須在**使用者暫存表空間**建立。
- 表空間前置: 資料庫建立時**不自動建立**使用者暫存表空間,需 DBA 先 `CREATE USER TEMPORARY TABLESPACE`。
- Schema 固定: 暫存表 Schema 永遠是 `SESSION`,引用時可省略或寫 `SESSION.TAB`。
- Commit 預設清空: `ON COMMIT PRESERVE ROWS` 可保留資料,預設 `ON COMMIT DELETE ROWS`。
- Rollback 刪除表: 執行 `ROLLBACK` 會**刪除暫存表定義**,而非僅回滾資料。
- V8+ 支援日誌: `LOGGED` / `NOT LOGGED` 選項控制是否記錄重做日誌(預設 `NOT LOGGED`)。
建立範例
-- 先建立使用者暫存表空間
CREATE USER TEMPORARY TABLESPACE usrtmp
MANAGED BY SYSTEM USING ('/db2tmp/usrtmp')
BUFFERPOOL IBMDEFAULTBP;
-- 應用程式中宣告
DECLARE GLOBAL TEMPORARY TABLE SESSION.TMP_ORDERS (
ORDER_ID INT NOT NULL,
CUST_ID INT,
AMT DECIMAL(12,2)
) ON COMMIT PRESERVE ROWS NOT LOGGED;
常見誤區
| 誤區 | 正確認知 |
| 以為 `CREATE GLOBAL TEMPORARY TABLE` 存在 | DB2 無此語法,唯有 `DECLARE GLOBAL TEMPORARY TABLE` |
| 以為暫存表跨 Session 可見 | 嚴格 Session 級私有,Session 結束自動消失 |
| 在一般表空間建立暫存表 | **必須**在 USER TEMPORARY TABLESPACE |
| ROLLBACK 後繼續用同暫存表 | ROLLBACK 會 Drop 表,需重新 DECLARE |