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