如何避免 dbms_metadata.GET_DEPENDENT_DDL 的错误

How can I avoid errors with dbms_metadata.GET_DEPENDENT_DDL

我正在编写一个自定义程序来将数据库元数据转储到文件中,以便使用版本控制来管理它们。由于某些原因,数据泵或导出工作的默认方式并不理想(例如,我希望每个 table 有一个单独的目录)。

Sql 开发人员提供了多种为任何对象创建导出脚本的方法。一种方法是右键单击对象并选择 Quick DDL。通过查看它创建的日志,可以看到它发出的实际 SQL 以创建 DDL 脚本。我已经使用这些脚本编写了我的自定义程序,并且在大多数情况下,它们是完美的。

当我为物化视图生成 DDL 时,它生成的 SQL 是:

SELECT DBMS_METADATA.GET_DDL('MATERIALIZED_VIEW',:name,:owner) FROM DUAL 
UNION ALL 
SELECT DBMS_METADATA.GET_DEPENDENT_DDL('INDEX',TABLE_NAME, TABLE_OWNER) FROM (
    SELECT table_name, table_owner FROM all_indexes 
    WHERE table_owner = :owner AND table_name = :name 
    AND index_name NOT IN (
        SELECT constraint_name FROM sys.all_constraints 
        WHERE table_name = table_name AND constraint_type = 'P'
    ) AND ROWNUM = 1
) 
UNION ALL 
SELECT dbms_metadata.GET_DEPENDENT_DDL ('COMMENT', :name,:owner ) FROM DUAL

对于此脚本,当通过 SQL 开发人员 Quick DDL 执行时,它会正确生成实体化视图的元数据。当我在程序中 运行 这个脚本时(或者甚至手动使用 SQL 开发人员本身),它会产生以下错误:

ORA-31608: specified object of type COMMENT not found
ORA-06512: at "SYS.DBMS_METADATA", line 5805
ORA-06512: at "SYS.DBMS_METADATA", line 8436
ORA-06512: at line 1
31608. 00000 -  "specified object of type %s not found"
*Cause:    The specified object was not found in the database.
*Action:   Correct the object specification and try the call again.

这个具体化视图没有任何注释(很明显),但我希望子句的这一部分只是 return 0 行而不是生成错误(特别是因为 SQL 开发人员使用它本身似乎没有错误)。

有没有办法避免这个错误,同时在元数据中包含评论(如果存在)?

Oracle 10g 和 11g 数据库都存在这个问题。

我无法测试,因为我真的不知道如何在没有 comment 的情况下创建 mview...但是以下内容应该适合您。尝试查询 dba_mview_comments 而不是 dual 以在没有评论时不执行该功能。

UNION ALL
SELECT dbms_metadata.get_dependent_ddl ('COMMENT', :name, :owner)
  FROM dba_mview_comments mvc
 WHERE mvc.mview_name = :name AND
   mvc.owner = :owner AND
   length(comments) > 0 AND
   rownum = 1