Global Temporary Table (GTT) 定義永久存在於資料字典,但資料僅在 **會話** 或 **交易** 期間可見。不同會話互不干擾,Commit 或 Session 結束自動清理,無需手動維護,極適合暫存中間運算結果。
| 模式 | 語法 | 資料生命週期 | 適用場景 |
|---|---|---|---|
| 會話級 | ON COMMIT PRESERVE ROWS |
Session 結束才清除 | 跨多個交易的複雜 ETL、報表暫存 |
| 交易級 | ON COMMIT DELETE ROWS |
Commit/Rollback 即清除 | 單一交易內的中繼運算、暫存參數 |
-- 會話級暫存表
CREATE GLOBAL TEMPORARY TABLE gtt_session_data (
id NUMBER,
batch_no VARCHAR2(30),
proc_date DATE
) ON COMMIT PRESERVE ROWS;
-- 交易級暫存表
CREATE GLOBAL TEMPORARY TABLE gtt_txn_data (
tmp_key VARCHAR2(50),
tmp_val NUMBER
) ON COMMIT DELETE ROWS;
EXECUTE IMMEDIATE 動態 DML。DBMS_STATS.SET_TABLE_PREFS(..., 'GLOBAL_TEMP_TABLE_STATS', 'SESSION') 設定會話級統計。CREATE OR REPLACE PROCEDURE proc_temp_demo (
p_col1 IN VARCHAR2,
p_col2 IN VARCHAR2
) AS
v_cnt NUMBER;
BEGIN
-- 1. 確保表存在(僅首次執行需建立,實務建議部署腳本預建)
BEGIN
EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE gtt_demo (
col1 VARCHAR2(10), col2 VARCHAR2(10)
) ON COMMIT DELETE ROWS';
EXCEPTION WHEN OTHERS THEN
IF SQLCODE != -955 THEN RAISE; END IF; -- 忽略 "name already used"
END;
-- 2. 插入資料
EXECUTE IMMEDIATE 'INSERT INTO gtt_demo VALUES (:1, :2)' USING p_col1, p_col2;
-- 3. 查詢驗證
EXECUTE IMMEDIATE 'SELECT col1 FROM gtt_demo' INTO v_cnt;
DBMS_OUTPUT.PUT_LINE('Inserted: ' || v_cnt);
-- 4. 交易結束自動清除(ON COMMIT DELETE ROWS)
COMMIT;
END;
/
V$TEMPSEG_USAGE。DBMS_STATS.GATHER_TABLE_STATS(..., 'GTT_DEMO')。GTT 是 Oracle 處理暫時性資料的利器,善用 ON COMMIT PRESERVE/DELETE ROWS 搭配 12c+ 會話級統計,能大幅簡化 ETL 與複雜報表邏輯,並降低 Redo/Undo 壓力。