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

Saw*_*yer 5 database oracle

我有一个非常繁琐的任务,就是从一个巨大的模式中找到几个表,然后为这些表生成DDL.

说,我有一个schemaA有1000个表,我需要找到它是否tableA存在schemaA,如果存在,生成DDL并将其保存到文件系统,如果没有,打印它的名称或将其写入文件.有任何想法吗?

Jus*_*ave 16

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

SELECT dbms_metadata.get_ddl( 'TABLE', 'TABLEA', 'SCHEMAA' )
  FROM dual;
Run Code Online (Sandbox Code Playgroud)

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

SELECT COUNT(*) 
  FROM dba_objects
 WHERE owner = 'SCHEMAA'
   AND object_name = 'TABLEA'
   AND object_type = 'TABLE'
Run Code Online (Sandbox Code Playgroud)

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

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