我通过sqlplus与sys as sysdba连接到oracle数据库11.2.0.4企业版。如果我运行查询:
select DBMS_METADATA.GET_DDL ( 'TYPE' , 'SYS_PLSQL_9131_DUMMY_1' , 'SYS' ) from dual ;
我收到错误错误
*ORA-31603: object "SYS_PLSQL_9131_DUMMY_1" of type TYPE not found in schema "SYS"
ORA-06512: at "SYS.DBMS_METADATA", line 5805
ORA-06512: at "SYS.DBMS_METADATA", line 8344*
如果我运行
,我也会遇到类似的错误 select DBMS_METADATA.GET_DDL ( 'TYPE_BODY' , 'SYS_PLSQL_9131_DUMMY_1' , 'SYS' ) from dual ;
select DBMS_METADATA.GET_DDL ( 'TYPE_SPEC' , 'SYS_PLSQL_9131_DUMMY_1' , 'SYS' ) from dual ;
如果我查询DBA_OBJECTS
或DBA_SOURCE
,TYPE类型的对象就在那里。
即使我在SYS模式中查询其他TYPE类型对象,我也会收到这些错误,但并非所有TYPE类型对象都会给我这个问题。
答案 0 :(得分:1)
这些类型应该由包隐式创建。查询object_id 9131的DBA_OBJECTS(类型名称中的数字)。
它可能是指一个包具有一个函数,该函数返回一个值,该值具有在包规范中定义的数据类型,而不是简单的VARCHAR2 / NUMBER / DATE。
答案 1 :(得分:1)
为什么会抛出错误?问题不在于权限或代码。问题是,有时Oracle对象实际上并不是声称的对象类型。并非所有“表”都是真实表,并非所有“类型”都是真实类型。 Oracle可以创建支持其他对象的对象,例如嵌套表和系统生成的集合类型。
我如何预先告知会发生什么错误?据我所知,没有官方文档或数据字典视图会告诉您何时某个对象不是真实对象。最好的指南可能是this answer中的条件。特别是这部分:
...
--These objects are included with other object types.
and object_type not in ('INDEX PARTITION','INDEX SUBPARTITION',
'LOB','LOB PARTITION','TABLE PARTITION','TABLE SUBPARTITION')
--Ignore system-generated types that support collection processing.
and not (object_type = 'TYPE' and object_name like 'SYS_PLSQL_%')
--Exclude nested tables, their DDL is part of their parent table.
and (owner, object_name) not in (select owner, table_name from dba_nested_tables)
--Exlclude overflow segments, their DDL is part of their parent table.
and (owner, object_name) not in (select owner, table_name from dba_tables where iot_type = 'IOT_OVERFLOW')
某些对象无法导出,需要忽略。