DBA 常需提取表、索引、預存程序、觸發器等結構定義(DDL)以遷移系統或預建物件。Oracle 9i 前:
EXP ROWS=NO 匯出:輸出格式差、含引用字串、難重用Oracle 9i 引入 DBMS_METADATA 套件,可直接從資料字典提取可立即執行的標準 DDL,支援單一物件至完整 Schema。
DBMS_METADATA.GET_DDL(
object_type IN VARCHAR2, -- 物件類型:TABLE, INDEX, PROCEDURE...
name IN VARCHAR2, -- 物件名稱
schema IN VARCHAR2 DEFAULT NULL, -- Schema 名稱
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT 'DDL'
) RETURN CLOB;
-- 單一物件
SELECT DBMS_METADATA.GET_DDL('TABLE', 'EMP', 'SCOTT') FROM DUAL;
SELECT DBMS_METADATA.GET_DDL('INDEX', 'PK_EMP', 'SCOTT') FROM DUAL;
-- 完整 Schema 級別
SELECT DBMS_METADATA.GET_DDL('TABLE', u.table_name, u.owner)
FROM USER_TABLES u;
SELECT DBMS_METADATA.GET_DDL('INDEX', u.index_name, u.owner)
FROM USER_INDEXES u;
PCTFREE、PCTUSED、FREELISTS、FREELIST GROUPSDBMS_METADATA 提取 DDL → 執行建立物件IMP IGNORE=Y 導入資料(忽略已存在物件錯誤)-- 移除儲存條款(跨平台遷移時有用)
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'STORAGE', FALSE);
-- 移除 Tablespace 指定
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'TABLESPACE', FALSE);
-- 包含授權語句
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'GRANTS', TRUE);
套件自動處理物件依賴順序(如先建表後建索引/觸發器),但跨 Schema 參考需手動排序。
DBMS_METADATA_DIFF 比較兩資料庫結構差異DBMS_METADATA.GET_DEPENDENT_DDL 取得相依物件 DDLEXPDP/IMPDP) 內建 METADATA_ONLY 參數,大量遷移首選DBMS_METADATA 徹底解決 DDL 提取難題,從「寫腳本的工匠」變為「呼叫 API 的架構師」。掌握此工具,Schema 遷移、版本控管、文件產出效率將指數級提升。