我有一个非常繁琐的任务,就是从一个巨大的模式中找到几个表,然后为这些表生成DDL。
说,我有一个schemaA
有1000个表,我需要查找此tableA
中是否存在schemaA
,如果存在,则生成DDL并将其保存到文件系统,如果没有,打印出来的名称或将其写入文件。有什么想法吗?
答案 0 :(得分:16)
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并将该数据写入客户端操作系统上的文件。