首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 全局臨時表完整指南:會話級 vs 事務級、LOB 限制、自定義擴展方案、視圖封裝透明化

     編輯:Oracle 資料庫基礎

全局臨時表 (GTT) 是 Oracle 處理中間結果集的輕量級工具,數據僅在會話/事務內可見,不產生 REDO、不佔用永久表空間。本文系統對比兩類型、實測限制、提供自定義擴展方案支援 LOB/外鍵/跨會話訪問。

1. 兩類型定義與差異

特性會話級 (ON COMMIT PRESERVE ROWS)事務級 (ON COMMIT DELETE ROWS)
數據生命周期會話結束時截斷COMMIT/ROLLBACK/會話結束時截斷
跨事務可見是否
典型場景多步驟業務流程中間表單語句/單事務臨時集合

2. 創建語法


-- 會話級
CREATE GLOBAL TEMPORARY TABLE student (
  stu_id NUMBER(5), class_id NUMBER(5),
  stu_name VARCHAR2(8), stu_memo VARCHAR2(200)
) ON COMMIT PRESERVE ROWS;

-- 事務級
CREATE GLOBAL TEMPORARY TABLE classes (
  class_id NUMBER(5), class_name VARCHAR2(8), class_memo VARCHAR2(200)
) ON COMMIT DELETE ROWS;

3. 核心限制(官方實現)

  • 不支持 LOB 類型(CLOB/BLOB/NCLOB/BFILE)
  • 不支持主外鍵約束
  • 統計信息共享(DBMS_STATS.GATHER_TABLE_STATS 影響所有會話),12c+ 支持會話級統計
  • DDL 操作需獨佔鎖,高併發創建/截斷可能等待

4. 適用場景判斷

  • 大表關聯查詢,中間結果集小且重複使用 → GTT 緩存中間集
  • 複雜報表多階段計算,階段間數據傳遞
  • 會話級上下文數據暫存(購物車、權限快照)

5. 自定義擴展方案:突破 LOB/外鍵/跨會話限制

設計思路

  1. 創建普通表 + SESSION_ID 列(SYS_CONTEXT('USERENV','SID'))
  2. 登出觸發器:DELETE FROM ext_gtt WHERE session_id = :old_sid
  3. 寫入時自動帶入 SESSION_ID
  4. 讀取時自動過濾 WHERE session_id = SYS_CONTEXT(...)

增強功能

  • 視圖封裝:CREATE VIEW v_ext_gtt AS SELECT * FROM ext_gtt WHERE session_id = SYS_CONTEXT('USERENV','SID'),應用層零感知
  • 觸發器自動填充:BEFORE INSERT ON ext_gtt FOR EACH ROW BEGIN :new.session_id := SYS_CONTEXT('USERENV','SID'); END;
  • 高權限跨會話訪問:管理員角色繞過視圖過濾,實現全局審計/清理
  • 支援 LOB/外鍵/分區/壓縮:繼承普通表所有特性

6. 選型決策樹

需要 LOB/外鍵/跨會話審計?
  ├─ 否 → 官方 GTT(會話級/事務級)
  └─ 是 → 自定義擴展表 + 視圖 + 觸發器 + 登出清理

自定義方案本質是「應用級多租戶隔離」,適合中間件層統一實現,避免業務代碼散落 SESSION_ID 邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved