从整个Oracle DB获取DDL的有效方法

时间:2011-07-14 20:28:09

标签: oracle oracle11g ddl

目前,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有一些非常基本的东西。

4 个答案:

答案 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;