【发布时间】:2010-11-12 01:24:46
【问题描述】:
我有一个极其繁琐的任务,就是从一个巨大的模式中找到几个表,并为这些表生成 DDL。
说,我有一个 schemaA 有 1000 个表,我需要查找此 tableA 是否存在于此 schemaA 中,如果存在,则生成 DDL 并将其保存到文件系统,如果不存在,打印它的名称或将其写入文件。有什么想法吗?
【问题讨论】:
我有一个极其繁琐的任务,就是从一个巨大的模式中找到几个表,并为这些表生成 DDL。
说,我有一个 schemaA 有 1000 个表,我需要查找此 tableA 是否存在于此 schemaA 中,如果存在,则生成 DDL 并将其保存到文件系统,如果不存在,打印它的名称或将其写入文件。有什么想法吗?
【问题讨论】:
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 并将该数据写入客户端操作系统上的一个文件。
【讨论】: