【问题标题】:How to programmatically generate DDL from Oracle database?如何以编程方式从 Oracle 数据库生成 DDL?
【发布时间】:2010-11-12 01:24:46
【问题描述】:

我有一个极其繁琐的任务,就是从一个巨大的模式中找到几个表,并为这些表生成 DDL。

说,我有一个 schemaA 有 1000 个表,我需要查找此 tableA 是否存在于此 schemaA 中,如果存在,则生成 DDL 并将其保存到文件系统,如果不存在,打印它的名称或将其写入文件。有什么想法吗?

【问题讨论】:

    标签: database oracle


    【解决方案1】:

    DBMS_METADATA 包(假设您使用的是相当新的 Oracle 版本)将为数据库中的任何对象生成 DDL。所以

    SELECT dbms_metadata.get_ddl( 'TABLE', 'TABLEA', 'SCHEMAA' )
      FROM dual;
    

    将返回一个带有 SchemaA.TableA 的 DDL 的 CLOB。您可以捕获对象不存在所引发的异常,但我倾向于建议您查询数据字典(即 DBA_OBJECTS)以验证 SchemaA 中是否存在名为 TableA 的表,即

    SELECT COUNT(*) 
      FROM dba_objects
     WHERE owner = 'SCHEMAA'
       AND object_name = 'TABLEA'
       AND object_type = 'TABLE'
    

    请注意,如果您无权访问 DBA_OBJECTS,则可以改用 ALL_OBJECTS。然而,这里的问题是,SchemaA 中可能有一个您没有 SELECT 访问权限的 TableA。该表不会出现在 ALL_OBJECTS(它包含您有权访问的所有对象)中,但它会出现在 DBA_OBJECTS(它包含数据库中的所有对象,无论您是否能够访问它们)。

    然后您可以将 DDL 写入文件,或者,如果计数为 0,则表明该对象不存在。从存储过程中,您可以使用 UTL_FILE 包写入数据库服务器上的文件。如果您尝试写入客户端文件系统上的文件,则需要使用可以访问客户端操作系统资源的语言。一个小的 C/Java/Perl/ 等程序应该能够选择一个 CLOB 并将该数据写入客户端操作系统上的一个文件。

    【讨论】:

    • 太好了,贾斯汀,我已经测试了你的 sql 的第一部分效果很好,但是当我运行第二部分时,我得到了 ORA-00942:表或视图不存在。以及如何使用 sql 将 clob 写入文件?
    • 微小的遗漏 - 第一个示例 SQL 需要在 'TABLE' 和 'TABLEA' 之间使用逗号,否则它将失败。
    • 有没有办法从 DDL 中省略 SCHEMA?我正在尝试获取表创建 DDL,即使我没有指定架构,它也会将包含的所有内容放在“SCHEMA.”前面。我注意到它还返回了许多不需要的选项,例如 TABLESPACE 或 STORAGE 详细信息。有没有办法排除这些选项?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2018-04-23
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    相关资源
    最近更新 更多