Oracle 11g 引入 Virtual Column,允許在表定義中直接聲明衍生列,其值由表達式或函數實時計算,不佔用磁盤存儲。語法:
COLUMN_NAME [datatype] GENERATED ALWAYS AS (expression) [VIRTUAL]
VIRTUAL 關鍵字可選。
CREATE TABLE emp (
empno NUMBER(6),
sal NUMBER(8,2),
comm NUMBER(8,2),
sal_pack GENERATED ALWAYS AS (sal + NVL(comm,0)) VIRTUAL
);
sal_pack 由 sal + NVL(comm,0) 即時計算。INSERT/UPDATE 虛擬列(報 ORA-54013)。INSERT INTO emp (empno, sal, comm) VALUES (10, 1500, 500);SELECT * FROM emp; 顯示計算後的 sal_pack=2000。CREATE INDEX sal_pack_idx ON emp(sal_pack);函數必須聲明 DETERMINISTIC:
CREATE OR REPLACE FUNCTION sum_num (n1 NUMBER, n2 NUMBER) RETURN NUMBER DETERMINISTIC AS
BEGIN RETURN n1 + n2; END;
ALTER TABLE emp ADD sal_pack_temp GENERATED ALWAYS AS (sum_num(sal, comm));
COMMENT ON COLUMN emp.sal_pack IS 'Virtual column [sal + comm]';
| 優勢 | 限制 |
|---|---|
| 零存儲開銷,實時計算 | 不可作為分區鍵 |
| 支持索引、約束、統計信息收集 | 表達式不可包含非確定性函數(如 SYSDATE) |
| 簡化視圖與函數索引維護 | 導出/導入時需注意版本兼容 |
虛擬列是 Oracle 11g 為「計算列」場景提供的原生輕量級方案,尤其適合報表查詢、衍生指標、業務規則固化等高頻只讀、低頻寫入的列,值得在新系統設計中優先考慮。