【问题标题】:Efficient way to obtain DDL from entire Oracle DB从整个 Oracle DB 获取 DDL 的有效方法
【发布时间】:2011-10-05 16:25:39
【问题描述】:

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

【问题讨论】:

  • 我很抱歉这个问题和其他问题的相似之处,我不明白其他问题的答案。 (或者这个,但是。)
  • 在您的编辑中,您需要一个 WHERE 条件,将查询限制为仅为您想要 DDL 的 30 个表生成 DDL。尝试为 SYS 拥有的表生成 DDL 是没有意义的。
  • 我想我需要关于 where 子句的线索。
  • 如果您知道表所在的架构,请使用“where owner in ('SCHEMA1', 'SCHEMA2', 'SCHEMA3')”之类的内容,将 SCHEMA1 等替换为实际的架构名称.

标签: oracle oracle11g ddl


【解决方案1】:

这对我有用:

SELECT dbms_metadata.get_ddl('TABLE', table_name)
  FROM user_tables;

【讨论】:

    【解决方案2】:

    您可以使用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>>
    

    【讨论】:

    • +1:很好的例子.. DBA_TABLES 可能更合适,这取决于用户运行查询的权限
    • @Craig 我不明白你的评论。 DBA_TABLE 会去哪里?会有什么影响?
    • @FarmBoy - DBA_TABLES 视图包含有关数据库中每个表的数据,但您可能无权访问 DBA_TABLESALL_TABLES 视图包含有关您有权访问的每个表的数据。 USER_TABLES 视图包含有关您拥有的每个表的数据。您可以或多或少地互换使用这三个视图,具体取决于您要查找的数据。我猜您可能有权访问您尝试为其获取 DDL 的 30 个表,因此我使用了ALL_TABLES
    • USER_TABLES 允许我省略 where 子句吗?
    • @FarmBoy - 如果您想获取您拥有的每张桌子的 DDL(即您拥有 30 张有问题的桌子),可以。 USER_TABLES 没有 OWNER 列,因此您需要在对 DBMS_METADATA 的调用中对所有者进行硬编码
    【解决方案3】:

    是的,您可以很容易地使用 dbms_metadata 包。您可以编写一个例程,在USER_TABLES 系统表上打开一个游标并获取每个表的 ddl。文章中也有一个例子。

    【讨论】:

      【解决方案4】:

      如果要为每个对象单独生成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;
      

      【讨论】:

        猜你喜欢
        • 2018-07-30
        • 2013-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多