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

DB2 9.5 全局變量深度解析:會話級共享狀態的新範式

     編輯:DB2 教學

背景痛點

傳統關係型數據庫中,同一會話內多條 SQL 語句間共享信息,應用程序需手動在本地變量間搬運數據;觸發器、視圖等數據庫內部對象更無法訪問會話上下文。開發者被迫在應用層添加邏輯傳遞狀態,增加複雜度並引入安全隱患。

全局變量:會話級私有狀態的數據庫原生支持

DB2 9.5 引入全局變量,作為一種新型數據庫對象,定義存於系統編目,值具備會話隔離性:每個會話擁有私有副本,互不干擾。無需應用代碼即可實現 SQL 語句間、會話與數據庫內部對象(觸發器/視圖/函數)間的狀態共享。

核心特性

  • 作用域:會話(連接)級,斷開連接自動銷毀
  • 類型支持:內置標量類型、區分類型、引用類型(不支持 LOB、XML、ARRAY、結構類型)
  • 默認值:常量、特殊寄存器、另一全局變量、表達式(≤64K、不修改數據、不調用外部動作)
  • 權限控制:CREATE/DROP 需 SYSADM/DBADM/CREATE_IN;讀取需 READ,修改需 WRITE;所有者自動擁有所有權限
  • 不可變定義:創建後無法修改類型、長度、默認值

語法速查

創建

CREATE VARIABLE schema.var_name data_type DEFAULT expr;
-- 範例
CREATE VARIABLE mySchema.defaultPrinter VARCHAR(30) DEFAULT 'Printer001';
CREATE VARIABLE loginTime TIMESTAMP DEFAULT CURRENT TIMESTAMP;
CREATE VARIABLE schema1.gvDeptno INTEGER DEFAULT 
  ((SELECT deptno FROM hr.employees WHERE empUser = SESSION_USER));

刪除

DROP VARIABLE schema.var_name;
-- 若被函數/觸發器/視圖引用則不可刪除

讀取與修改

-- 讀取
VALUES schema.var_name;
SELECT * FROM tab WHERE col = schema.var_name;
EXEC SQL VALUES schema.var_name INTO :host_var;

-- 修改
SET schema.var_name = 'NewValue';
SELECT COUNT(*) INTO schema.activeEmployees FROM hr.employees WHERE active = 'Y';
CALL proc(..., OUT schema.var_name);

實戰場景:優雅控制觸發器行為

問題:維護窗口需插入歷史數據,但觸發器 validate_t 禁止 ORDER_DATE 超過 7 天。傳統做法:鎖表 → 刪觸發器 → 維護 → 重建觸發器 → 解鎖,風險高、停機長。

全局變量方案:

  1. 創建開關變量:CREATE VARIABLE maint.bypassTrigger CHAR(1) DEFAULT 'N';
  2. 修改觸發器條件:
    CREATE TRIGGER validate_t
    BEFORE INSERT ON T
    REFERENCING NEW AS N
    FOR EACH ROW
    WHEN (N.ORDER_DATE < CURRENT TIMESTAMP - 7 DAYS AND maint.bypassTrigger = 'N')
    SIGNAL SQLSTATE '38000' SET MESSAGE_TEXT = 'ORDER DATE TOO OLD';
  3. 維護時:SET maint.bypassTrigger = 'Y'; → 執行維護 → SET maint.bypassTrigger = 'N';

優勢:無 DDL、無鎖表、會話隔離(僅當前會話生效)、瞬時生效/回滾。

使用限制

  • 不可用於:CHECK 約束、生成列定義、刷新即時 MQT、需確定性表達式的場景
  • 首次引用時實例化並計算默認值
  • 表達式不可包含修改數據或外部動作
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved