2010-11-12 48 views
5

我有一个非常繁琐的任务,就是从一个庞大的模式中查找几个表,并为这些表生成DDL。如何以编程方式从Oracle数据库生成DDL?

说,我已经有了一个schemaA有1000个表,我需要找到如果在这个schemaA存在一个tableA,如果这样做,生成DDL,并将其保存到文件系统,如果不这样做,打印它的名字了或将其写入文件。有任何想法吗?

回答

16

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

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

将为SchemaA.TableA返回带DDL的CLOB。你可以赶上抛出的对象不存在异常,但我往往会建议你查询数据字典(即DBA_OBJECTS),以验证是否有一个名为表A中SchemaA表,即

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

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

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

+0

伟大的,贾斯汀,我已经测试了你的sql工程的第一部分很棒,但是当我运行第二部分时,我得到了一个ORA-00942:表或视图不存在。我怎样才能使用sql编写一个clob到文件? – Sawyer 2010-11-12 01:54:31

+0

@ZZcat - 更新了我的回答 – 2010-11-12 02:08:53

+0

Tiny省略 - 第一个示例SQL需要'TABLE'和'TABLEA'之间的逗号,否则失败。 – 2012-11-14 11:37:22

相关问题