目前,Oracle 11.1数据库中大约有30个表。
有没有办法用一个命令生成所有ddl? (或者一些命令?)
修改 根据下面的建议,我试过了:
SELECT dbms_metadata.get_ddl( 'TABLE', table_name, owner )
FROM all_tables;
得到了:
ORA-31603: object "HS_PARTITION_COL_NAME" of type TABLE not found in schema "SYS"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105
ORA-06512: at "SYS.DBMS_METADATA", line 3241
ORA-06512: at "SYS.DBMS_METADATA", line 4812
ORA-06512: at line 1
31603. 00000 - "object \"%s\" of type %s not found in schema \"%s\""
*Cause: The specified object was not found in the database.
*Action: Correct the object specification and try the call again.
很明显,我不明白dbms_metadata
有一些非常基本的东西。
答案 0 :(得分:4)
这对我有用:
SELECT dbms_metadata.get_ddl('TABLE', table_name)
FROM user_tables;
如果这是错误的,请低估我。我对Oracle知之甚少,所以我不明白为什么没有一个答案只是提供了一个有效的查询。
答案 1 :(得分:3)
您可以使用DBMS_METADATA package。像
这样的东西SELECT dbms_metadata.get_ddl( 'TABLE', table_name, owner )
FROM all_tables
WHERE <<some condition to get the 30 tables in question>>
答案 2 :(得分:2)
是的,你可以很容易地使用dbms_metadata包。您可以编写一个例程,在USER_TABLES
系统表上打开游标,并获取每个表的ddl。这方面的一个例子也在文章中。
答案 3 :(得分:0)
如果要为每个对象单独生成ddl,
查询是:
--GENERATE DDL FOR ALL USER OBJECTS
--1. FOR ALL TABLES
SELECT DBMS_METADATA.GET_DDL('TABLE', TABLE_NAME) FROM USER_TABLES;
--2. FOR ALL INDEXES
SELECT DBMS_METADATA.GET_DDL('INDEX', INDEX_NAME) FROM USER_INDEXES WHERE INDEX_TYPE ='NORMAL';
--3. FOR ALL VIEWS
SELECT DBMS_METADATA.GET_DDL('VIEW', VIEW_NAME) FROM USER_VIEWS;
OR
SELECT TEXT FROM USER_VIEWS
--4. FOR ALL MATERILIZED VIEWS
SELECT QUERY FROM USER_MVIEWS
--5. FOR ALL FUNCTION
SELECT DBMS_METADATA.GET_DDL('FUNCTION', OBJECT_NAME) FROM USER_PROCEDURES WHERE OBJECT_TYPE = 'FUNCTION'
GET_DDL 函数不支持某些object_type,如LOB,MATERIALIZED VIEW,TABLE PARTITION
因此,生成DDL的合并查询将是:
SELECT OBJECT_TYPE, OBJECT_NAME,DBMS_METADATA.GET_DDL(OBJECT_TYPE, OBJECT_NAME, OWNER) FROM ALL_OBJECTS WHERE (OWNER = 'XYZ') AND OBJECT_TYPE NOT IN('LOB','MATERIALIZED VIEW', 'TABLE PARTITION') ORDER BY OBJECT_TYPE, OBJECT_NAME;