如何以编程方式从 Oracle 数据库生成 DDL?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 详细信息。有没有办法排除这些选项?谢谢。

以上是关于如何以编程方式从 Oracle 数据库生成 DDL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 中为所有用户和权限生成 DDL

创建调用 ORACLE 数据库以获取指定类型对象的 DDL 的 C# 例程

如何生成 Oracle 模式的整个 DDL(可编写脚本)?

SQL - 以编程方式比较 sql ddl

如何以编程方式将用户添加到 Oracle APEX 4.x 中的访问控制列表?

如何以编程方式创建“数据库创建脚本”?