如何避免dbms_metadata.GET_DEPENDENT_DDL出错

时间:2016-05-25 21:09:39

标签: oracle oracle-sqldeveloper

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

Sql Developer提供了许多为任何对象创建导出脚本的方法。一种方法是右键单击对象并选择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 Developer Quick DDL执行时,它会正确生成实例化视图的元数据。当我在程序中运行此脚本(或者甚至使用SQL Developer本身手动运行)时,会产生以下错误:

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.

这个特定的物化视图没有任何注释(显然),但我希望该子句的这一部分只返回0行而不是生成错误(特别是因为SQL Developer使用它本身似乎没有错误)。

有没有办法可以避免此错误,但如果元数据中存在注释,仍然会包含注释?

Oracle 10g& 11g数据库。

1 个答案:

答案 0 :(得分:2)

我无法测试,因为我不知道如何在没有mview的情况下创建comment ...但是下面的内容应该适合您。尝试查询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