開發/維護中頻繁需求:「這張表怎麼建的?」、「這個索引欄位順序?」、「Package 規格長什麼樣?」。MySQL 有 SHOW CREATE TABLE,Oracle 靠 DBMS_METADATA.GET_DDL。
DBMS_METADATA.GET_DDL (
object_type IN VARCHAR2, -- 物件類型
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;
| 物件 | object_type | 查詢視圖 |
|---|---|---|
| TABLE | TABLE | USER_TABLES / DBA_TABLES |
| INDEX | INDEX | USER_INDEXES |
| VIEW | VIEW | USER_VIEWS |
| SEQUENCE | SEQUENCE | USER_SEQUENCES |
| PACKAGE | PACKAGE | USER_OBJECTS (OBJECT_TYPE='PACKAGE') |
| PACKAGE BODY | PACKAGE_BODY | USER_OBJECTS (OBJECT_TYPE='PACKAGE BODY') |
| PROCEDURE | PROCEDURE | USER_PROCEDURES / USER_OBJECTS |
| FUNCTION | FUNCTION | USER_PROCEDURES / USER_OBJECTS |
| TRIGGER | TRIGGER | USER_TRIGGERS |
| TYPE | TYPE | USER_TYPES |
| MATERIALIZED VIEW | MATERIALIZED_VIEW | USER_MVIEWS |
| TABLESPACE | TABLESPACE | DBA_TABLESPACES |
SELECT object_name, object_type FROM user_objects ORDER BY object_type, object_name;
SELECT DBMS_METADATA.GET_DDL('TABLE', 'TB_STUDENT', 'JELLY') FROM dual;
SET LONG 1000000
SET PAGESIZE 0
SPOOL schema_ddl.sql
SELECT DBMS_METADATA.GET_DDL('TABLE', table_name, 'JELLY') FROM user_tables;
SPOOL OFF
SELECT DBMS_METADATA.GET_DDL('INDEX', 'STUDENTID_INDEX', 'JELLY') FROM dual;
SELECT DBMS_METADATA.GET_DDL('VIEW', 'V_TB_STUDENT', 'JELLY') FROM dual;
SELECT DBMS_METADATA.GET_DDL('SEQUENCE', 'TEST_SEQ', 'JELLY') FROM dual;
SELECT DBMS_METADATA.GET_DDL('TRIGGER', trigger_name) FROM user_triggers;
SELECT DBMS_METADATA.GET_DDL('TABLE', table_name, owner)
FROM dba_tables WHERE owner = 'SCOTT';
BEGIN
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'STORAGE', FALSE); -- 移除 STORAGE 子句
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'TABLESPACE', FALSE); -- 移除 TABLESPACE
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'SEGMENT_ATTRIBUTES', FALSE);
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'PRETTY', TRUE); -- 美化縮排
END;
/
SELECT DBMS_METADATA.GET_DDL('TABLE', 'EMP') FROM dual;
SELECT_CATALOG_ROLE 或物件擁有者權限。SELECT ANY DICTIONARY 或 DBA 權限。Oracle 物件定義反查核心 = DBMS_METADATA.GET_DDL(object_type, name, schema)。搭配 USER_*/DBA_* 視圖列舉物件,配合 SET_TRANSFORM_PARAM 產出乾淨可移植 DDL,是 DBA/開發者日常必備技能。