無標準化翻譯流程下,應用層處理多語言極其繁瑣。透過資料庫層面的基礎表、翻譯表、視圖設計,可自動依 USERENV('LANG') 輸出對應語言,開發者專注業務邏輯。
CREATE TABLE base_countries ( a2 CHAR(2) NOT NULL, -- 國家代碼 ISO 3166-1 alpha-2 a3 CHAR(3) NOT NULL, num CHAR(3) NOT NULL, name VARCHAR2(60) NOT NULL, CONSTRAINT base_countries_pk PRIMARY KEY (a2) );
CREATE TABLE tran_countries ( a2 CHAR(2) NOT NULL, lang VARCHAR2(2) NOT NULL, -- 語言代碼,如 ZH, FR, DE name VARCHAR2(60) NOT NULL, CONSTRAINT tran_countries_pk PRIMARY KEY (a2, lang), CONSTRAINT tran_countries_fk FOREIGN KEY (a2) REFERENCES base_countries (a2) );
CREATE OR REPLACE VIEW nls_countries AS
SELECT b.a2, b.a3, b.num,
NVL(t.name, b.name) name
FROM base_countries b, tran_countries t
WHERE b.a2 = t.a2 (+)
AND USERENV('LANG') = t.lang (+);
CREATE OR REPLACE VIEW nls_countries AS
SELECT b.a2, b.a3, b.num,
NVL(t.name, b.name) name
FROM base_countries b
LEFT OUTER JOIN tran_countries t
ON b.a2 = t.a2
AND t.lang = USERENV('LANG');
ALTER SESSION SET NLS_LANGUAGE = 'CHINESE' 或客戶端環境變數 NLS_LANGUSERENV('LANG') 回傳當前 Session 語言代碼SELECT * FROM nls_countries 即獲當地語言column_id 識別欄位lang 採 zh_CN, zh_TW 格式created_by, updated_at此模式符合「資料與邏輯分離」原則,一次部署、多語言自動切換,大幅降低應用層複雜度。