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